1. 介绍
Binder是Android下基于C/S架构的进程间通信机制,基于开源OpenBinder
从实现上来说可分为Binder驱动、ServiceManager、Server、Client四个组成部分
2. Binder驱动
Binder驱动代码主要位于drivers/android目录
2.1 数据结构
数据结构 | 说明 |
binder_device | binder设备,系统初始化时会定义binder、hwbinder、vndbinder三个设备 |
binder_context | binder上下文,每个binder设备包含一个上下文结构 |
binder_proc | binder进程记录,每个打开binder设备的进程均包含该结构,用来记录该进程的各种信息和状态。例如:线程表、binder节点表、节点引用表 |
binder_thread | binder线程,记录了线程相关的信息,例如需要完成的任务等 |
binder_node | binder节点 |
binder_transaction | binder事务 |
binder_buffer | binder缓冲区,由mmap创建,用于binder事务 |
binder_alloc | binder proc的地址空间 |
2.2 初始化
binder_init() /* * 创建如下目录和文件 * 目录 * /sys/kernel/debug/binder * /sys/kernel/debug/binde/proc * 文件 * $(BINDER_PROC)/state -- 记录状态信息 * $(BINDER_PROC)/stats -- 记录统计信息 * $(BINDER_PROC)/transactions -- 记录transaction相关信息 * $(BINDER_PROC)/transaction_log -- 记录transaction日志相关信息 * $(BINDER_PROC)/failed_transaction_log -- 记录失败的transaction日志相关信息 * 文件读取函数依次为 * binder_state_show() * binder_stats_show() * binder_transactions_show() * binder_transactions_log_show() * - * $(BINDER_PROC) = /sys/kernel/debug/binde/proc */ debugfs_create_dir("binder") debugfs_create_dir("proc") debugfs_create_dir("state") debugfs_create_dir("stats") debugfs_create_dir("transactions") debugfs_create_dir("transaction_log") debugfs_create_dir("failed_transaction_log") /* * 注册/dev/binder, /dev/hwbinder, /dev/vndbinder设备 */ init_binder_device() misc_register(binder_fops) /* binder设备操作集 */ static const struct file_operations binder_fops = { .owner = THIS_MODULE, .poll = binder_poll, .unlocked_ioctl = binder_ioctl, .compat_ioctl = binder_ioctl, .mmap = binder_mmap, .open = binder_open, .flush = binder_flush, .release = binder_release, };
2.3 打开
当应用打开一个binder设备时,在内核中中会执行binder_open
- 分配并创建binder_proc结构
- 初始化binder_proc的context、tsk、todo、default_priority、context、alloc等成员变量
- 将binder_proc保存到file::private_data结构中, 以之后的mmap、ioctl中获取
- 将binder_proc::proc_node插入全局变量binder_procs中
- 创建/sys/kernel/debug/binde/proc/`pid`目录