这段时间花了很多的精力来研究binder相关的源码,恰巧看到一篇博文讲解了几个Binder相关的问题,问题提得很不错,弄清楚了这些问题之后对Binder的了解肯定会大大加深。(相关的链接是听说你Binder机制学的不错,来解决下这几个问题)
这篇博文主要是根据我自己的理解来解答这些问题。分析的代码版本是7.1的。
Binder的定向制导,如何找到目标Binder,如何唤起进程或者线程
首先要明白一些背景知识。binder驱动程序代码中,每一个binder服务端都有对应的binder_node结构体,binder_node当中又包含了指向服务端实例的指针。为了描述客户端和服务端的一一对应的关系,又有了binder_ref结构体,即binder引用对象。这个binder_ref由客户端进程来管理的,客户端进程连接了几个binder服务端,该进程(binder_proc)中就会有多少个binder_ref。binder_ref当中又引用了对应的binder_node。也就是说,客户端进程想要与服务段作沟通,那么它必须先要找到对应的服务端在本进程中的binder_ref,然后通过binder_ref引用的binder_node找到服务端实例。
明白了以上这些,现在这个问题就可以转化成,如何在客户端进程内找到对应的服务端的binder引用对象(binder_ref)。事实上服务端启动后,也仅仅是在驱动中建立相应的binder_node,客户端进程当中是不存在binder_ref的,客户端想要找到这个binder_ref,首先还需要保