千家信息网

struct binder_node的示例分析

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要介绍struct binder_node的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!struct binder_node {int debug_id;
千家信息网最后更新 2025年02月02日struct binder_node的示例分析

这篇文章主要介绍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的示例分析"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

对象 实体 事务 进程 驱动 处理 成员 组件 变量 程序 线程 队列 文件 驱动程序 宿主 指向 目标 同步 通信 示例 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 浙江常见软件开发报价 军队手机网络安全教育心得体会 山东软件开发公司招聘 1串口服务器 卤股票软件开发 合肥享充网络技术如何终止充电 阿里云怎么租服务器 网络技术 考什么 泽思网络安全工程师 csgo社区服务器 qq微信无法连接服务器怎么办 服务器没有发现目标资源 智慧云平台投标客户端服务器地址 pki网络安全认证技术 网络正能量和网络安全妙招 c语言数据库操作 远程连接数据库报错1499 数据库自动改密码是什么 宣城点餐系统软件开发需要多少钱 一个软件开发需要哪些人员 网络安全手抄报写什么内容 简单 灌南口碑好的网络技术专业服务 土建钢筋算量软件开发 量化投资软件开发工具 信息系统与数据库技术学习通 什么是计算机的网络技术 浙江浪潮服务器哪个厂家质量好 贵州学习软件开发排名 2016服务器硬盘怎么重新分区 国内未突破的网络技术
0