这篇文章主要介绍struct binder_node的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
struct binder_node {
int debug_id; // 帮助调试用的
// 当Binder实体对象的引用计数由0变为1或由1变为0时,Binder驱动程序就会请求相应的
// Service组件增加或减少其引用计数。Binder驱动程序就会将“该引用计数修改”封装成一个类
// 型为一个类型为binder_node的工作项,即将成员work的值置为BINDER_WORK_NODE,并将
// 它添加到相应进程的todo队列中等待处理
struct binder_work work;
union {
struct rb_node rb_node;
struct hlist_node dead_node;
};
// 指向宿主进程,宿主进程使用一个红黑树来维护它内部所有Binder实体对象,而每一个
// Binder实体对象的成员变量rb_node就正好是这个红黑树的一个节点。如果Binder实体对象
// 的宿主进程已经死亡,那么该Binder实体对象就会通过它的成员变量dead_node保存在一个全
// 局的hash列表中。
struct binder_proc *proc;
// 一个Binder实体对象可能会同时被多个Client组件引用,因此Binder驱动使用结构体
// binder_ref来描述这些引用关系,并且将引用了同一个Binder实体对象的所有引用都保存在
// 一个hash列表中。这个hash列表通过Binder实体对象的refs成员来描述,而Binder驱动通
// 过refs就可以知道有哪些Client组件引用了同一个Binder实体对象
struct hlist_head refs;
int internal_strong_refs; // 描述Bidner实体对象的强引用计数
int local_weak_refs; // 描述Binder实体对象的弱引用计数
int local_strong_refs; // 描述Bidner实体对象的强引用计数
void __user *ptr; // 描述用户空间中的Service组件,指向Service的影子对象
void __user *cookie; // 描述用户空间中的Service组件的地址,指向Service的地址
// 当Binder实体对象请求Service执行某个操作时,会增加该Service的强/弱引用计数,
// has_strong_ref和has_weak_ref被置1;
// 当Service完成Binder所请求的操作后,会递减该Service的强/弱引用计数,has_strong_ref和has_weak_ref被置0;
// Binder实体在请求Service增/减强/弱引用计数的过程中,会将
// pending_strong_ref或pending_weak_ref置1;
// 当Service完成增/减强/弱引用计数之后,会将这两个成员变量置为0。
unsigned has_strong_ref:1;
unsigned pending_strong_ref:1;
unsigned has_weak_ref:1;
unsigned pending_weak_ref:1;
// 描述Binder对象是否正在处理一个异步事务。Binder驱动程序将一个事务保存在todo队列中
// 表示将由该线程来处理该事务。每个事务都关联着一个Binder实体对象,要求与该Binder实
// 体对象对应的Service组件在指定线程中处理该事务。然而,当Binder驱动发现一个事务是异
// 步事务时,就会将它保存在目标Binder实体对象的一个异步事务队列中,这个异步事务队列就
// 是由成员变量async_todo来描述的。异步事务的定义是那些单向的进程间通信请求,即不需
// 要等待应答的进程间通信请求,与此相对的是同步事务。因为不需要等待应答,Binder驱动就
// 认为异步事务优先级低于同步事务,具体表现为在同一时刻,一个Binder实体对象的所有异步
// 事务最多只有一个会得到处理,其余的都等待在异步事务队列中,而同步事务无此限制。
unsigned has_async_transaction:1;
// 描述Binder实体对象是否可以接收包含有文件描述符的进程间通信数据。1表示可以接收,0表
// 示禁止接收。当一个进程向另一个进程发送的数据中包含有文件描述符时,Binder驱动程序就
// 会自动在目标进程中打开一个相同的文件。基于安全性考虑,Binder程序就要通过该变量防止
// 源进程在目标进程中打开文件。
unsigned accept_fds:1;
// 表示Binder实体对象在处理来自Client进程的请求时,他所要求的处理线程(即Server进程
// 中的一个线程)应具备的最小线程优先级。
unsigned min_priority:8;
struct list_head async_todo;
};
以上是“struct binder_node的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。