Android Binder驱动程序

Binder驱动程序

Binder驱动程序实现在内核中,它主要由binder.h和binder.c两个源文件组成。下面我们就开始介绍Binder驱动程序的基础知识,包括基础数据结构、初始化过程,以及设备文件/dev/binder的打开(open)、内存映射(mmap)和内核缓冲区管理等操作。

基础数据结构

在Binder驱动程序中有两种类型的数据结构,其中一种是在内部使用的,另一种是在内部和外部均会使用到的。接下来,我们分别对这些数据结构进行介绍。

首先看一下binder_work结构体的定义:

struct binder_work {
    struct list_head entry;
    enum {
        BINDER_WORK_TRANSACTION = 1,
        BINDER_WORK_TRANSACTION_COMPLETE,
        BINDER_WORK_NODE,
        BINDER_WORK_DEAD_BINDER,
        BINDER_WORK_DEAD_BINDER_AND_CLEAR,
        BINDER_WORK_CLEAR_DEATH_NOTIFICATION,
    } type;
};

结构体binder_work用来描述待处理的工作项,这些工作项有可能属于一个进程,也会有可能属于一个进程中的某一个线程。成员变量entry用了将该结构体嵌入到一个宿主结构中,成员变量type用来描述工作项的类型。根据成员变量type的取值,Binder驱动程序就可以判断出一个binder_work结构体嵌入到什么类型的宿主结构中。
接下来,我们看一下binder_node结构体的定义:

struct binder_node {
    int debug_id;
    struct binder_work work;
    union {
        struct rb_node rb_node;
        struct hlist_node dead_node;
    };
    struct binder_proc *proc;
    struct hlist_head refs;
    int internal_strong_refs;
    int local_weak_refs;
    int local_strong_refs;
    void __user *prt;
    void __user *cookie;
    unsigned has_strong_ref:1;
    unsigned pending_strong_ref:1;
    unsigned has_weak_ref:1;
    unsigned pending_weak_ref:1;
    unsigned has_async_transaction:1;
    unsigned accpet_fds:1;
    unsigned min_priority:8;
    struct list_head async_todo;
};

结构体binder_node用来描述一个Binder实体对象。每一个Service组件在Binder驱动程序中都对应一个Binder实体对象,用来描述它在内核中的状态。Binder驱动程序通过强引用计数和弱引用计数技术来维护它们的生命周期。
成员变量proc指向一个Binder实体对象的宿主进程。在Binder驱动程序中,这些宿主进程通过一个binder_proc结构体来描述。宿主进程使用一个红黑树来维护它内部所有的Binder实体对象,而每一个Binder实体对象的成员变量rb_node就正好是这个红黑树中的一个节点。如果一个Binder实体对象的宿主进程已经死亡了,那么这个Binder实体对象就会通知它的成员变量dead_node保存在一个全局的hash列表中。

你可能感兴趣的:(android,Binder)