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. jQuery源码02--(3043 , 3183) Deferred : 延迟对象 : 对异步的统一管理

    //延迟对象 jQuery.extend({ Deferred: function( func ) { var tuples = [//resolve完成.reject未完成.notify进行中类似于 ...

  2. Python: PS 滤镜-- Fish lens

    本文实现 PS 滤镜中的一种几何变换– Fish lens, 对图像做扭曲,感觉就像通过一个凸镜或者凹镜在观察图像一样. import numpy as np from skimage import ...

  3. iOS-APP-Icon 图标启动图及名字的设置

    本文讲下appIcon图标.启动图及名字的设置 icon for iOS 图标大小参照苹果官网:https://developer.apple.com/library/ios/qa/qa1686/_i ...

  4. javafx KeyCombination

    import javafx.application.Application; import javafx.application.Platform; import javafx.event.Actio ...

  5. 跨域使用onmessage实现方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. php汉字转化为拼音函数

    <?php function Pinyin($_String, $_Code='gb2312'){ $_DataKey = "a|ai|an|ang|ao|ba|bai|ban|ban ...

  7. scrollBarStyle- listview滑动条调整

    今天在解决问题的时候,需要设置listview滚动条,使listview的内容不能被滚动条覆盖 后来发现网上提到一个 ScrollView 属性.ScrollView中ScrollBar的style ...

  8. 1.3 Quick Start中 Step 4: Send some messages官网剖析(博主推荐)

    不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Step 4: Send some messages Step : 发送消息 Kaf ...

  9. 8 Great Java 8 Features No One's Talking about--转载

    原文地址:http://www.infoq.com/articles/Java-8-Quiet-Features If you haven’t seen some of the videos or t ...

  10. StartCoroutine的使用

    StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程. 在C#中直接有Thread这个线程,可是在unity中有些元素是不能操作的.这个时候能够使用协程来完毕. 使 ...