文章目录
-
-
- hlist_node: linux 内核哈希表
- binder_work: binder工作类型
- binder_node: binder实体
- binder_ref_death: binder 死亡结构体
- binder_ref: binder引用
- binder_proc: 在驱动中记录着进程的信息
- binder_context:记录ServiceManager信息
- binder_alloc:管理和分配、映射buffer
- binder_thread:在内核中表示线程
- binder_transaction: 事务项
- flat_binder_object: 将binder扁平化,可以在进程间传递
- binder_fd_object: 文件描述符
- binder_buffer_object:用于描述用户空间下的缓存
- binder_write_read:用户向驱动ioctl的交互数据
- binder_transaction_data:表示传输内容,是用户层和 binder 驱动传递数据的数据结构
- binder_buffer:缓存
- 四个驱动动作
-
翻看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; // 监听死亡通知的对象地址</