Binder 驱动
Binder IPC 正是基于内存映射(mmap)来实现的,但是 mmap() 通常是用在有物理介质的文件系统上的。
比如进程中的用户区域是不能直接和物理设备打交道的,如果想要把磁盘上的数据读取到进程的用户区域,需要两次拷贝(磁盘-->内核空间→用户空间);
通常在这种场景下 mmap() 就能发挥作用,通过在物理介质和用户空间之间建立映射,减少数据的拷贝次数,用内存读写取代 I/O 读写,提高文件读取效率。
而 Binder 并不存在物理介质,因此 Binder 驱动使用 mmap() 并不是为了在物理介质和用户空间之间建立映射,而是用来在内核空间创建数据接收的缓存空间。
binder 驱动在以 misc 设备进行注册,作为虚拟字符设备,没有直接操作硬件,只是对设备内存的处理。
主要是驱动设备的初始化(binder_init),打开 (binder_open),映射(binder_mmap),数据操作(binder_ioctl)。
用户态的程序调用 Kernel 层驱动是需要陷入内核态,进行系统调用(syscall),
比如打开 Binder 驱动方法的调用链为: ==open-> __open() -> binder_open()==。
open()为用户空间的方法,__open()便是系统调用中相应的处理方法,通过查找,对应调用到内核 binder 驱动的 binder_open()方法,至于其他的从用户态陷入内核态的流程也基本一致。
用户空间调用 open()方法,最终会调用 binder 驱动的 binder_open()方法;mmap()/ioctl()方法也是同理,在 BInder 系列的后续文章从用户态进入内核态,都依赖于系统调用过程。
评论