struct binder_node的示例分析

发布时间:2021-12-30 10:01:26 作者:小新
来源:亿速云 阅读:185

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

推荐阅读:
  1. golang struct
  2. C之 struct 和 union(十)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

node

上一篇:php合成图片出现乱码怎么解决

下一篇:如何进行IdentityServer4 RSA 证书加密

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》