Binder框架
Binder是什么
1.Binder是一种进程间通信机制; 2.Binder是一个虚拟物理设备驱动; 3.Binder是一个能发起通信的Java类;
Binder与传统IPC对比
| Binder | 共享内存 | Socket |
---|
性能 | 内存拷贝一次 | 无需拷贝 | 内存拷贝两次 | 特点 | 基于C/S架构 易用性高 稳点性好 | 控制复杂 易用性差 | 基于C/S架构,作为通用接口,其传输效率低,开销大 | 安全性 | 为每个app分配UID,支持实名和匿名 | 依赖上层协议,访问接入点是开放的,不安全 | 依赖上层协议,访问接入点是开放的,不安全 |
Binder数据传输流程
在了解传输流程之前,先简单了解下Android中的内存划分以及内存映射【mmap】概念; ####内存划分 内存被操作系统划分成两块:用户空间和内核空间,用户空间是用户程序代码运行的地方,内核空间是内核代码运行的地方。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。
mmap()
Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)。 对文件进行mmap,会在进程的虚拟内存分配地址空间,创建映射关系。 实现这样的映射关系后,就可以采用指针的方式读写操作这一段内存,而系统会自动回写到对应的文件磁盘上。 所有的系统资源管理都是在内核空间中完成的。比如读写磁盘文件,分配回收内存,从网络接口读写数据等等。用户空间通过系统调用让内核空间完成这些功能。 1.调用write,告诉内核需要写入数据的开始地址与长度; 2.内核将数据拷贝到内核缓存; 3.由操作系统调用,将数据拷贝到磁盘,完成写入;
####Binder数据传输流程
总结:通过Binder机制将数据从发送方通过copy_from_user()方法复制到内核地址空间,而接收方地址空间和内核地址空间通过mmap()映射到同一块物理内存地址,因此整体只需要内存拷贝一次,而普通ipc通信则需要将数据先从发送方缓冲区拷贝到内核地址空间,再从内核地址空间拷贝到接收方缓冲区,整体下来需要两次拷贝;【binder传输的数据大小限制为1M-8K,Binder驱动里限制 】
Binder驱动的四个主要方法
- binder_init 初始化binder驱动;
- binder_open 打开binder驱动;
- binder_mmap 设置内存映射;
- binder_ioctl 数据读写操作;
|