4. 服务获取过程

test_client客户端:

(1)在用户态先构造name=“hello”的数据(服务的名字是hello),调用ioctl发送数据给service_manager(handle=0)

(2)进入内核态后根据handle=0找到service_manger,把数据放入它的todo链表,唤醒service_manager进程,自己休眠

(5)在内核态被唤醒后返回handle=1给用户态,在用户态中得到handle=1,然后就可以根据handle来给服务发送数据了(传数据给服务的时候根据handle在test_client的binder_proc结构体中根据refs_by_desc找到binder_ref,在找到服务binder_node,在找到服务进程,驱动程序把数据放到服务进程的todo链表,这样test_server就可以处理数据了)

service_manager端:

(3)其在内核态被唤醒后返回数据到他的用户态,取出数据,得到“hello”后在svclist链表里根据hello找到一项,得知其hello服务的handle=1,用ioctl把这个handle发给驱动,在service_manager的内核态中,从它的的binder_pro结构体中根据handle,从refs_by_desc树中找到binder_ref,然后找到hello服务的binder_node,然后根据proc找到服务进程

(4)接着在内核态为test_client创建binder_ref,其desc=1,表示在test_client进程中hello服务对应的handle=1,,binder_ref的node是指向test_server提供的hello服务节点,同时表示test_client的binder_proc结构体的refs_by_desc树被加入这个刚创建的binder_ref,内核态把组织的数据(handle=1)放入test_client的todo链表,接着唤醒test_client

./test_client hello

open("/dev/binder")

ioctl

构造数据,并调用binder_call发送BC_TRANSACTION类型数据,数据的组织格式:四字节全零+len(android.os.IServiceManager)(长度用四字节表示)+android.os.IServiceManager(每个字符用两字节表示)+len("hello")(长度用四字节表示)+hello(每个字符用两字节表示),接着去读,先读到一个BR_NOOP类型数据,然后在内核态休眠
[21334.646270] test_client (1379, 1379), binder_thread_write : BC_TRANSACTION
[21334.646361] binder: 1379:1379 BC_TRANSACTION 6 -> 1369 - node 1, data beccaa6c-beccaa5c size 80-0
[21334.646465] test_client (1379, 1379), binder_transaction , print data :
[21334.646540] 0000: 00 . 00 . 00 . 00 . 1a . 00 . 00 . 00 . 61 a 00 . 6e n 00 . 64 d 00 . 72 r 00 .
[21334.655133] 0016: 6f o 00 . 69 i 00 . 64 d 00 . 2e . 00 . 6f o 00 . 73 s 00 . 2e . 00 . 49 I 00 .
[21334.663985] 0032: 53 S 00 . 65 e 00 . 72 r 00 . 76 v 00 . 69 i 00 . 63 c 00 . 65 e 00 . 4d M 00 .
[21334.672839] 0048: 61 a 00 . 6e n 00 . 61 a 00 . 67 g 00 . 65 e 00 . 72 r 00 . 00 . 00 . 00 . 00 .
[21334.681692] 0064: 05 . 00 . 00 . 00 . 68 h 00 . 65 e 00 . 6c l 00 . 6c l 00 . 6f o 00 . 00 . 00 .
[21334.690570] test_client (1379, 1379), binder_thread_read : BR_NOOP

open

ioctl

mmap

service_manager被唤醒后读到BR_TRANSACTION类型数据,数据值与发送的一样

[21334.696735] service_manager (1369, 1369), binder_thread_read : BR_TRANSACTION
[21334.703848] service_manager (1369, 1369), binder_thread_read , print data :
[21334.710791] 0000: 00 . 00 . 00 . 00 . 1a . 00 . 00 . 00 . 61 a 00 . 6e n 00 . 64 d 00 . 72 r 00 .
[21334.719627] 0016: 6f o 00 . 69 i 00 . 64 d 00 . 2e . 00 . 6f o 00 . 73 s 00 . 2e . 00 . 49 I 00 .
[21334.728477] 0032: 53 S 00 . 65 e 00 . 72 r 00 . 76 v 00 . 69 i 00 . 63 c 00 . 65 e 00 . 4d M 00 .
[21334.737335] 0048: 61 a 00 . 6e n 00 . 61 a 00 . 67 g 00 . 65 e 00 . 72 r 00 . 00 . 00 . 00 . 00 .
[21334.746188] 0064: 05 . 00 . 00 . 00 . 68 h 00 . 65 e 00 . 6c l 00 . 6c l 00 . 6f o 00 . 00 . 00 .
[21334.755072] test_client (1379, 1379), binder_thread_read : BR_TRANSACTION_COMPLETE

[21334.762623] service_manager (1369, 1369), binder_thread_write : BC_FREE_BUFFER

service_manager根据hello名字找到handle之后构造一个flat_binder_object类型的数据给test_client,flat_binder_object结构体的type是BINDER_TYPE_HANDLE表示引用,handle是handle=1,这个结构体数据通过ioctl发给驱动程序,驱动程序最后会调用binder_transaction来处理BC_REPLY数据,找到其要回复给那个进程,并把数据从service_manager用户态把数据复制进内核态,发到target_proc(test_client进程)的空间中去,先处理flat_binder_object数据,根据数据中handle在当前进程service_manager中找到binder_ref,接着给test_client创建一个binder_ref节点,其中的node指向hello服务,然后修改flat_binder_object数据的handle值为新建的这个binder_ref.desc,接着把数据放入test_client进程的todo链表,唤醒test_client
[21334.769822] service_manager (1369, 1369), binder_thread_write : BC_REPLY
[21334.776508] binder: 1369:1369 BC_REPLY 7 -> 1379:1379, data bee71a5c-bee71a4c size 16-4
[21334.784503] service_manager (1369, 1369), binder_transaction , print data :
[21334.791426] 0000: 85 . 2a * 68 h 73 s 7f . 01 . 00 . 00 . 01 . 00 . 00 . 00 . 00 . 00 . 00 . 00 .
[21334.800285] test_client (1379, 1379), binder_thread_read : BR_NOOP
[21334.806455] service_manager (1369, 1369), binder_thread_read : BR_NOOP

[21334.812986] test_client (1379, 1379), binder_thread_read : BR_REPLY
[21334.819195] test_client (1379, 1379), binder_thread_read , print data :
[21334.825795] 0000: 85 . 2a * 68 h 73 s 7f . 01 . 00 . 00 . 01 . 00 . 00 . 00 . 00 . 00 . 00 . 00 .
[21334.834653] service_manager (1369, 1369), binder_thread_read : BR_TRANSACTION_COMPLETE
[21334.842584] test_client (1379, 1379), binder_thread_write : BC_ACQUIRE
[21334.849076] service_manager (1369, 1369), binder_thread_read : BR_NOOP
[21334.855583] test_client (1379, 1379), binder_thread_write : BC_FREE_BUFFER
[21334.862530] test_client (1379, 1379), binder_thread_write : BC_RELEASE

x

9.3 Binder系统_驱动情景分析_服务获取过程的更多相关文章

  1. 9.2 Binder系统_驱动情景分析_服务注册过程

    1. 几个重要结构体的引入给test_server添加一个goodbye服务, 由此引入以下概念: 进程间通信其实质也是需要三要素:源.目的.数据,源是自己,目的用handle表示:通讯的过程是源向实 ...

  2. 9.4 Binder系统_驱动情景分析_服务使用过程

    5. 服务使用过程 test_client进程: 用户态: (1)已结获得了“hello”服务,handle=1; (2)构造数据:code(那个函数)和函数参数 (3)发送ioctl后进入内核态,先 ...

  3. 9.5 Binder系统_驱动情景分析_transaction_stack机制

    参考文章:http://www.cnblogs.com/samchen2009/p/3316001.html test_server服务进程可能有多个线程,而在发送数据的时候handle只表示了那个进 ...

  4. 9.6 Binder系统_驱动情景分析_server的多线程实现

    当多个client对server发出请求的时候,如果server忙不过来的时候会创建多线程来处理请求 那么忙不过来由谁来判断? server进程有个binder_proc结构体,其里面有todo链表( ...

  5. Android系统--Binder系统具体框架分析(二)Binder驱动情景分析

    Android系统--Binder系统具体框架分析(二)Binder驱动情景分析 1. Binder驱动情景分析 1.1 进程间通信三要素 源 目的:handle表示"服务",即向 ...

  6. Android : 跟我学Binder --- (4) 驱动情景分析

    目录: Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制? Android : 跟我学Binder --- (2) AIDL分析及手动实现 ...

  7. 10.7 android输入系统_Dispatcher线程情景分析_Reader线程传递事件和dispatch前处理

    android输入系统C++最上层文件是com_android_serve_input_InputManagerService.cpp global key:按下按键,启动某个APP可以自己指定,修改 ...

  8. [RK3288][Android6.0] 系统按键驱动流程分析【转】

    本文转载自:http://blog.csdn.net/kris_fei/article/details/77894406 Rockchip的按键驱动位于 kernel/drivers/input/ke ...

  9. 8.6 Android灯光系统_源码分析_背光灯

    Change system screen brightness, using android.provider.Settings.System.SCREEN_BRIGHTNESSandroid-er. ...

随机推荐

  1. python-安装xlrd xlwt 插件

    最近需要对比两个表格的内容,然后修改其中的某列内容.因为工作量太大,所以想通过python来实现.上网查了相关的操作,其中牵扯到两个功能模块,xlrd xlwt.这两个功能模块分别是对excel进行读 ...

  2. View State

    如何查看viewstate 鼠标右键页面,然后view page source 源码中搜索viewstate,会找到一个隐藏的字段. <input type="hidden" ...

  3. 误操作 rpm -e --nodeps zlib

    误删缘由:目的是要升级ssh版本,结果好像是冥冥之中有股力量在作祟迫使我粘了一条致死的命令rpm -e --nodeps  zlib就执行了,奇怪的是执行之后根本就全然不知.最后在敲rpm命令时居然报 ...

  4. spring cloud config配置中心源码分析之注解@EnableConfigServer

    spring cloud config的主函数是ConfigServerApplication,其定义如下: @Configuration @EnableAutoConfiguration @Enab ...

  5. 用 cctld工具创建带有国家代码的IP地址表

    用 cctld工具创建带有国家代码的IP地址表 cctld tools is creating IP addresses table with Country Code 项目地址 https://gi ...

  6. 3.SOAP和WSDL的一些必要知识

    转自:https://www.cnblogs.com/JeffreySun/archive/2009/12/14/1623766.html SOAP和WSDL对Web Service.WCF进行深入了 ...

  7. 提高IIS的FTP安全性 管理员的九阴真经

    提高IIS的FTP安全性 管理员的九阴真经 <九阴真经>是很多武林高手蒙昧以求的武林秘籍,在系统管理员这个武林中也有很多类似<九阴真经>一样的秘籍.在这里就向大家介绍一下有关提 ...

  8. 用Zebra打造Linux下小型路由器

    用Zebra打造Linux下小型路由器 现在的Internet网络相当庞大,不可能在不同的网络之间建立直接的连接,所以这时就必须用路由器为不同网络之间的通信提供路径选择.Linux下搭建路由器价格非常 ...

  9. 快速傅里叶变换FFT(模板)

    好不容易闲下来总结一下FFT.QAQ 1.DFT: 对于多项式的乘法,DFT给了我们新的思路(点值表达式的O(n)相乘) 对于我们习惯的多项式算法例如多项式A(x)=5x+1和B(x)=2x+2 C( ...

  10. ArcGIS小技巧——多图层情况下交互显示效果

    在使用ArcMap处理数据的过程中,通常需要对比不同图层之间的差异.或者查看影像配准情况,这时我通常会怀念ENVI中的强大的拉幕显示.闪烁.亮度和透明度显示工具...... 直到有一天,闲着没事干捣鼓 ...