Binder 核心 API
Binder 核心 API
1.binder_init
该方法主要是为了注册 misc 设备,debugfs_create_dir 是指在 debugfs 文件系统中创建一个目录,返回值是指向 dentry 的指针

注册 misc 设备,miscdevice 结构体,便是前面注册 misc 设备时传递进去的参数

file_operations 结构体,指定相应文件操作的方法,可以看到在上面用户空间的方法会最终调用到对应的方法,就是根据这个来定的

2.binder_open
创建 binder_proc 对象,并把当前进程等信息保存到 binder_proc 对象,该对象管理 IPC 所需的各种信息并拥有其他结构体的根结构体;再把 binder_proc 对象保存到文件指针 filp,以及把 binder_proc 加入到全局链表 binder_procs。

Binder 驱动中通过 static HLIST_HEAD(binder_procs);,创建了全局的哈希链表 binder_procs,用于保存所有的 binder_proc 队列,每次新创建的 binder_proc 对象都会加入 binder_procs 链表中。

3.binder_mmap
主要功能:首先在内核虚拟地址空间,申请一块与用户虚拟内存相同大小的内存;然后再申请 1 个 page 大小的物理内存,再将同一块物理内存分别映射到内核虚拟地址空间和用户虚拟内存空间,从而实现了用户空间的 Buffer 和内核空间的 Buffer 同步操作的功能。


总结:
binder_init:初始化字符设备;binder_open:打开驱动设备,过程需要持有 binder_main_lock 同步锁;binder_mmap:申请内存空间,该过程需要持有 binder_mmap_lock 同步锁;binder_ioctl:执行相应的 ioctl 操作,该过程需要持有 binder_main_lock 同步锁;当处于 binder_thread_read 过程,read_buffer 无数据则释放同步锁,并处于 wait_event_freezable 过程,等有数据到来则唤醒并尝试持有同步锁。
评论