binder 驱动数据结构

翻看2019年的自己整理的文章,才发现学习的东西都好肤浅,很多东西都不思其解。以此为契机,回来重新学习binder。2020加油!

binder驱动中的重要的数据结构

hlist_node: linux 内核哈希表

// hash桶的头结点
struct hlist_head {
   
    struct hlist_node *first;//指向每一个hash桶的第一个结点的指针
};

//hash桶的普通结点
struct hlist_node {
   
    struct hlist_node *next;//指向下一个结点的指针
    struct hlist_node **pprev;//指向上一个结点的next指针的地址
}

binder_work: binder工作类型

struct binder_work {
   
    struct list_head entry; // binder_work双向列表,存储所有binder_work

    enum {
    // binder_work类型
        BINDER_WORK_TRANSACTION = 1,
        BINDER_WORK_TRANSACTION_COMPLETE,
        BINDER_WORK_RETURN_ERROR,
        BINDER_WORK_NODE,
        BINDER_WORK_DEAD_BINDER,
        BINDER_WORK_DEAD_BINDER_AND_CLEAR,
        BINDER_WORK_CLEAR_DEATH_NOTIFICATION,
    } type;
};

binder_node: binder实体

struct binder_node {
   
    int debug_id; // 调试使用的创建时分派的id
    spinlock_t lock;
    struct binder_work work; // 工作类型
    union {
   
        struct rb_node rb_node; // 正常使用的binder节点,会被链接到proc->nodes
        struct hlist_node dead_node; // 已死的binder节点,但被其他proc引用,该实体会被通过dead_node存放在哈希表binder_dead_nodes
    };
    struct binder_proc *proc; // binder所在进程
    struct hlist_head refs; // Binder实体的所有Binder引用的链表
    int internal_strong_refs;
    int local_weak_refs;
    int local_strong_refs;
    int tmp_refs;
    binder_uintptr_t ptr; // binder实体的对应用户空间的server端的内存地址
    binder_uintptr_t cookie; // binder实体的对应用户空间的server端的其他数据的内存地址
    struct {
   
        u8 has_strong_ref:1;
        u8 pending_strong_ref:1;
        u8 has_weak_ref:1;
        u8 pending_weak_ref:1;
    };
    struct {
   
        u8 accept_fds:1;
        u8 txn_security_ctx:1;
        u8 min_priority;
    };
    bool has_async_transaction; // 是否有异步的事务
    struct list_head async_todo; // 异步的todo队列
};

binder_ref_death: binder 死亡结构体

binder server死亡时候,通知client端

struct binder_ref_death {
   
    struct binder_work work;  // binder死亡类型
    binder_uintptr_t cookie; // 监听死亡通知的对象地址</
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值