您当前的位置: 首页 > 
  • 3浏览

    0关注

    417博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

05.Binder系统:第6课第6节_Binder系统_驱动情景分析_服务使用过程

江南才尽,年少无知! 发布时间:2019-04-02 10:54:20 ,浏览量:3

前面的小节我们已经讲解了服务的注册以及获取过程,该小节我们讲解服务的使用过程。

在服务获取过程中,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进程。
关注
打赏
1592542134
查看更多评论
立即登录/注册

微信扫码登录

0.0454s