binder IPC TRANSACTION过程分析(BC_TRANSACTION->Binder Driver)

本文深入剖析了Binder IPC通信中的BC_TRANSACTION命令处理过程,从Binder1到Binder Driver,再到Binder2。内容包括:如何判断命令接收方、如何存储通信数据、创建实体结点和引用结点、处理文件描述符的传递等关键步骤。
摘要由CSDN通过智能技术生成

在Binder IPC通信过程中,进程间通信都要先通过向Binder驱动发送BC_XXX命令,然后Binder 驱动稍做处理后通过对应的BR_XXX将命令转给给目标进程。

如果有返回值,进程也是先将返回结果以BC_REPLY的形式先发给Binder驱动,然后通过驱动以BR_REPLY命令转发。


PS:从Driver发出的命令以BR开始,而发往Driver的命令以BC开头。


Binder1通过BC_Transaction将通信数据发到Binder Driver,Binder Driver通过BR_Transaction将命令转发给Binder2去处理,最后都是通过BC_REPLY的命令将返回结果传回Binder Driver,Binder Driver再通过BR_REPLY将返回结果转发给Binder1。

相关函数binder_transaction(...)

先看BC_TRANSACTION命令的处理过程(binder1->Driver)。

首先,第一步,Binder驱动判断当前命令接收方是Service Manager还是普通的Server端,判断依据是tr->target.handle.if (tr->target.handle == 0)   表示该命令是发送特殊结点,即Service Manager,而else  针对一般情况,我们需要判断Binder驱动中有没有对应的结点引用,正常情况下应该是能够找到handle对应的Binder结点引用的。通过结点引用,我们就可以定位到处理命令的Binder结点(实体结点)。总之,我们要先知道这个命令是要发往何处。

else {
		if (tr->target.handle) {
			struct binder_ref *ref;
			ref = binder_get_ref(proc, tr->target.handle);
			if (ref == NULL) {
				binder_user_error("%d:%d got transaction to invalid handle\n",
					proc->pid, thread->pid);
				return_error = BR_FAILED_REPLY;
				goto err_invalid_target_handle;
			}
			target_node = ref->node;
		} else {
			target_node = binder_context_mgr_node;
			if (target_node == NULL) {
				return_error = BR_DEAD_REPLY;
				goto err_no_context_mgr_node;
			}
		}

有了Binder结点的信息,我们就可以知道它所处的进程了。

		target_proc = target_node->proc;
		if (target_proc == NULL) {
			return_error = BR_DEAD_REPLY;
			goto err_dead_binder;
		}

然后会有一个安全检查,主要是判断这通信双方所处的进程能不能传输数据。

		if (security_binder_transaction(proc->tsk, target_proc->tsk) < 0) {
			return_error = BR_FAILED_REPLY;
			goto err_invalid_target_handle;
		}

接下来,对于同步通信(即two way),且当前transaction_stack链表不为空的话(也即表示当前线程至少存在一个通信会话),
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值