内核的东西,看不懂啊,想理解理解binder结果看不懂,看懂一点记一点吧

本文详细解析了Binder机制中的关键函数,包括binder_node和binder_ref的创建与引用管理过程,阐述了binder_transaction_data结构体在跨进程通信中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【binder_node 】

binder_get_node  从binder_proc里面rbroot nodes这个树里面获得一个binder_node 节点。


binder_new_node 创建一个binder_node节点,并放到上面的树上。


binder_inc_node

binder_dec_node是对这个binder_node 进行强引用还是弱引用进行处理

【binder_ref】

binder_get_ref  从binder_proc里面rbroot nodes这个树里面获得一个binder_ref节点。

binder_get_ref_for_node 从binder_proc里面根据binder_node获取一个binder_ref节点。

                                             这里根据传入的binder_node创建了一个binder_ref节点,并把它放到列表里面了。

binder_delete_ref 这个从字面理解,就是删除一个ref节点。


binder_inc_ref

binder_dec_ref 也是强引用和弱引用。

我怀疑这个ref里面的desc就是给那个handle值。


我们记得在IPCThreadState::transact里面写的时候,写的命令是BC_TRANSACTION。

binder_thread_write里面有关于BC_TRANSACTION的处理,

这里有个binder_transaction_data结构体,我们看说明,

/* The first two are only used for bcTRANSACTION and brTRANSACTION,
* identifying the target and contents of the transaction.
*/

前面的两个变量用于bcTRANSACTION 和brTRANSACTION,指明目标和transaction的内容。

我们在另外一端也是用的这个结构体写入的。

if (copy_from_user(&tr, ptr, sizeof(tr)))
return -EFAULT;
ptr += sizeof(tr);
binder_transaction(proc, thread, &tr, cmd == BC_REPLY);


从某个地方拷贝了一块数据到tr中,我们就认为从驱动读出来的传入的值。

然后就到了binder_transaction这个函数里面。


binder_transaction_log_add是增加一个log,


binder_stats_created 创建一个状态

binder_stats_deleted删除一个状态

这里就看到new了一个ref并保存下来,就完了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值