前面的小节我们已经讲解了服务的注册以及获取过程,该小节我们讲解服务的使用过程。
在服务获取过程中,test_client进程的内核态会创建一个binder_proc结构体,其中包含两个红黑树成员refs_by_desc与refs_by_node,上面挂载着都是binder_ref(对服务的引用,如对hello服务的引用)节点,可以通过desc或者node查找,简单框图如下: 其中的挂载的binder_ref,有成员desc=1,node(指向test_server中的hello服务),根据前面的小节,我们已经知道test_client如何获得hello服务,那么他怎么使用服务呢? test_client流程如下
用户态:
1.已经获得了"hello"服务,其handle=1.
2.构造数据:
a. code:调用哪个函数
b. 参数
3.通过ioctrl发送数据(先写。后读)
15.取出返回值,执行完毕。
内核态(binder_iotcl):
4.根据handlr找出目的进程(根据node或者handlr,在test_client的红黑树上找到binder_ref结构体),
5.把数据放入目的进程test_server的todo链表
6.唤醒test_server进程,然后在binder_thread_read中休眠。
14.被唤醒,把数据返回给用户空间,
下面就轮到test_server执行了,下面是他的一个简单流程图: 从内核态开始
用户态:
8.取出数据,根据code调用函数,及传递参数
9.用返回值构造数据,
10.调用ioctl发送(REPLY)
内核态:
7.被唤醒,返回数据到到用户空间
11.找出要回复的进程(test_client)
12.把数据放入test_client的todo链表,
13.唤醒test_client进程。