Android的Binder机制阅读笔记

来源:互联网 发布:成语接龙查询软件 编辑:程序博客网 时间:2024/06/06 08:35

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

kernel/drivers/staging/binder.hkernel/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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑密码忘了怎么办最简单的方法 宿舍六个人有一个不想安空调怎么办 绝地求生开在了进游戏的页面怎么办 桃树树根有很大一个洞怎么办啊 截掉的枝干一直往下干怎么办 大佛肚竹的叶子都黄了怎么办 大佛肚竹的枝和叶都掉了怎么办 网吧锁屏后但我的页面没关怎么办 不干了公司把我东西扔了怎么办 竹子种了3个月也不发芽是怎么办 盆栽橘子树夏季叶子全掉了怎么办 盆栽藕叶子全干了是怎么办 家里的盆栽竹根部长霉怎么办 浅色衣服被蓝彩笔染上色怎么办 pr导出视频后显示素材丢失怎么办 ps抠下来的图边缘发白怎么办 ps中抠出的图边缘虚不圆滑怎么办 ps的文字工具多了圆框怎么办 苹果6s屏幕锁忘了密码怎么办 网上下载的3d模型渲染很慢怎么办 cad下载完成后出现闪退怎么办 婴儿在肚子里被系带绑到怎么办 我想给外地的朋友送花怎么办 英雄联盟连接不上聊天服务器怎么办 用黄金换玫瑰金后悔了怎么办 劳力士日志系列玫瑰金和黄金怎么办 香菇代进地注水后长满绿毛怎么办 群主给你带了不满意的头衘怎么办 普兰德雪地靴洗变色了怎么办 书被水泡了皱了黏了怎么办 书被水泡了皱了没干怎么办 眼皮干燥起皮起皱怎么办能治好吗 手指头起小水泡指甲不平整怎么办 这几天我的内裤上带点血丝怎么办 一个月宝宝私处捂白了怎么办 工资算了字签了老板没把钱怎么办 百合种球叶子都变黄了怎么办 新买的富贵竹叶子发黄怎么办水养 朋友总是以隐私为借口欺骗我怎么办 三星手机版本低下载不了微信怎么办 选了动漫制作技术但不会画画怎么办