写点什么

Binder 驱动

作者:北洋
  • 2022 年 7 月 09 日
  • 本文字数:581 字

    阅读完需:约 2 分钟

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 系列的后续文章从用户态进入内核态,都依赖于系统调用过程。



用户头像

北洋

关注

Android开发 2021.05.25 加入

记录Android学习之路 分享读书心得体会~

评论

发布
暂无评论
Binder驱动_Andriod_北洋_InfoQ写作社区