5.代理对象将请求结果进一步返回给客户端进程。
通过以上5个步骤,就完成了一次Binder通信。
三、Binder机制的组成
Binder机制由三部分组成,即:
1.Client;
2.Server;
3.ServiceManager。
三部分组件之间的关系:
1.Client、Server、ServiceManager均在用户空间中实现,而Binder驱动程序则是在内核空间中实现的;
2.在Binder通信中,Server进程先注册一些Service到ServiceManager中,ServiceManager负责管理这些Service并向Client提供相关的接口;
3.Client进程要和某一个具体的Service通信,必须先从ServiceManager中获取该Service的相关信息,Client根据得到的Service信息与Service所在的Server进程建立通信,之后Clent就可以与Service进行交互了;
4.Binder驱动程序提供设备文件/dev/binder与用户空间进行交互,Client、Server和ServiceManager通过open和ioctl文件操作函数与Binder驱动程序进行通信;
5.Client、Server、ServiceManager三者之间的交互都是基于Binder通信的,所以通过任意两者这件的关系,都可以解释Binder的机制。
四、Binder驱动的实现简介
1.Binder采用了AIDL来描述进程间的接口;
2.Binder是一个特殊的字符型设备,设备节点为dev/binder。
3.Binder驱动程序由以下两个文件实现:
①kernel/drivers/staging/binder.h
②kernel/drivers/staging/binder.c
4.在Binder驱动的实现过程中,以下函数起着关键作用:
①使用binder_ioctl()函数与用户空间交换数据;
②BINDER_WRITE_READ用来读写数据,数据包中的cmd域用于区分不同的请求;
③使用binder_thread_write()函数来发送请求或返回结果,在binder_thread_write()函数中,通过调用binder_transaction()函数来转发请求并返回结果.当收到请求时,binder_transaction()函数会通过对象的handle找到对象所在的进程,如果handle结果为空,则认为此对象是context_mgr,然后把请求发给context_mgr所在的进程,并将请求中所有的Binder对象放到RB树中,最后把请求放到目标进程的队列中以等待目标进程的读取。;










