Binder驱动之深入理解个人小记

Binder驱动的复杂性可想而知。

1.有一个服务端通过一个Binder驱动方式要将本地的一个Binder实体传递到客户端,以实现匿名的通信方式

该过程是在Binder驱动中的binder_transaction()来实现的,Binder驱动会为该实体创建一个当前进程所具有的一个node当然这个节点信息包含着这个Binder实体对象,方便客户端调用时找到真正的Binder实体。

创建了node节点后,将会将这个服务端进程创建的节点和目的客户端的进程进行类似绑定、记录的操作,即加入该节点信息到远程客户端的一个Binder引用链表中,其中以Binder的引用数值handle来区分不同进程,或者同一进程在该客户端进程的Binder引用,即一个客户端会拥有多个Binder的引用(也可以理解为代理),这些代理可能来源于同一个进程,但是区分它们的是一个handle数值。而这个handle就维护在客户进程的Bpxxx代理中,handle是BpBinder的一个成员变量

 

2.Bpxxx代理要远程调用服务时,在Binder的内核驱动中,通过唯一的handle会首先找到绑定的服务端的节点,即找到了该唤醒的服务进程。而服务进程被唤醒后,就会调用本地的Binder实体对象来实现。这个Binder实体对象是通过将找到的Node以一个事务binder_transaction的形式发送给目标进程的等待队列,即服务进程唤醒后会提取出这个事务,而这个事务本质上就是一个BBinder实体对象,有了这个Binder实体后就可以用来后续的服务处理。

 

 

 

你可能感兴趣的:(Binder驱动之深入理解个人小记)