Android binder介绍

时间:2022-05-12 06:05:40

1. 介绍

Binder是Android下基于C/S架构的进程间通信机制,基于开源OpenBinder

从实现上来说可分为Binder驱动、ServiceManager、Server、Client四个组成部分

2. Binder驱动

Binder驱动代码主要位于drivers/android目录

2.1 数据结构

binder_alloc binder_alloc
数据结构 说明
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`目录

2.4 映射