Android的Binder机制阅读笔记

Binder采用了AIDL来描述进程间的接口。在实际实现中,Binder是作为一个特殊的字符型设备而存在的,其设备节点为/dev/binder。实际实现代码有以下两个文件实现。

kernel/drivers/staging/binder.h
kernel/drivers/staging/binder.c

工作流程:
1、客户端首先获得服务器端的代理对象。
2、客户端通过调用服务器代理对象的方式向服务器端发送请求。
3、代理对象将用户请求通过Binder驱动发送到服务器进程。
4、服务器进程处理用户请求,并通过Binder驱动发送到服务器进程。
5、客户端收到服务端的返回结果。
所包含的数据结构
binder_work。表示在binder驱动中进程所要处理的工作项。

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_node。定义Binder实体对象。在Android系统中,每一个Service组件在Binder驱动程序中都有一个Binder实体对象。

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 interanl_strong_refs;
    int local_weak_refs;
    int local_strong_refs;
    void __user *ptr;
    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 accept_fds:1;
    unsigned min_priority:8;
    struct list_head async_todo;
}

binder_ref用于描述一个Binder引用对象。在Android系统中,每一个Client组件在Binder驱动程序中都有一个Binder引用对象。

struct binder_ref{
    int debug_id;
    struct rb_node rb_node_desc;
    struct rb_node rb_node_node;
    struct hlist_node node_entry;
    struct binder_proc *proc;
    struct binder_node *node;
    uint32_t desc;
    int strong;
    int weak;
    struct binder_ref_death *death;
}

binder_ref_death是一个通知结构体,只要某进程对某binder引用订阅了其实体的死亡通知,那么binder驱动将会为该binder引用建立一个binder_ref_death通知结构体,将其保存在当前进程的对应binder引用结构体的death域中。

struct binder_ref_death{
    struct binder_work work;
    void __user *cookie;
}

binder_buffer用于描述一个内核缓冲区,能够在进程之间传输数据。

struct binder_buffer{
    struct list_head entry;
    struct rb_node rb_node;

    unsigned free:1;
    unsigned allow_user_free:1;
    unsigned async_transaction:1;
    unsigned debug_id:29;

    struct binder_transaction *transaction;

    struct binder_node *trraget_node;
    size_t data_size;
    size_t offsets_size;
    uint8_t data[0];
}
  • entry:构建一个双向链表;
  • rb_node:表示一个红黑树节点;
  • transaction:用于中转请求和返回结果;
  • target_node:表示一个目标节点;
  • data_size:表示数据的大小;
  • offsets_size:表示一个偏移量;
  • data[0]:用于存储实际数据。
    binder_proc表示正在使用Binder进程通信机制的进程,能够保存调用Binder的各个进程或线程信息,如线程ID、进程ID、Binder状态信息等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值