学习笔记-binder1

92 阅读3分钟

Android 进程间通信

Linux 虚拟地址空间范围为0~4G,Linux内核将这4G字节的空间分为两部分,将最高的1G字节 (从虚拟地址0xC0000000到0xFFFFFFFF)供内核使用,称为 内核空间 。而将较低的3G字节( 从虚拟地址0x00000000到0xBFFFFFFF)供各个进程使用(每个进程都可以使用这3G空间,所以每个进程都拥有3G的用户空间),称为用户空间。 因为每个每个进程都可以通过系统调用进入内核,因此, linux内核由系统内的所有进程共享。于是,从进程的角度来看,每个进程可以拥有4G字节的虚拟空间。

内核空间和用户空间是相对隔离的,即使用户程序崩溃,也不会影响内核空间。

32位系统,即2^32,即总工可访问地址为4G,内核空间为1G,用户空间为3G
64位系统 低位:0 ~ 47位才是有效的可变地址(寻址空间256T),高位:48 ~ 63位全补0或全补1,一般高位全补0对应的地址空间是用户空间,高位全补1对应的空间是内核空间。

binder 与传统 IPC 对比

  • 共享内存:两个或者多个进程的内存是共享的,他们將自己的内存空间映射到同一块物理空间,因此多个进程都可以直接访问,无需进行数据拷贝,工作速度快。
  • Socket: 服务端的数据拷贝到内核空间,再由内核空间拷贝到客户端,数据两次拷贝,跨机器通信也是这样,因为跨机器是没有同一个内核空间。
  • Binder:发送方将数据拷贝至内核空间,而接收方的内存空间和内核空间指向同一块物理内存地址,因此接收方可以直接获取到数据,无需再次拷贝

传统IPC传输数据

binder传输数据

mmap

Linux 通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)。
对文件进行mmap,会在进程的虚拟内存分配地址空间,创建映射关系,实现这样的映射关系之后,就可以采用指针的方式读写操作这一段内存了,而系统会自动回写到对应的文件磁盘上。

文件操作

所有的系统资源管理都是在内核空间中完成的。比如读写磁盘文件,分配回收内存,从网络接口读写数据等。用户空间通过系统调用让内核空间完成这些功能。

写文件流程:

  1. 调用write,告诉内核需要写入数据的开始地址与长度。
  2. 内核将数据拷贝至内核缓存。
  3. 由操作系统调用,将数据拷贝到磁盘,完成写入