1、Binder系统过程分析,情景分析

server提供服务

(1)addService(服务名称,xxx)执行后会导致binder驱动在server的内核空间为服务创建一个binder_node结构体,并且会在service_manager内核空间创建一个binder_ref,其node参数指向server内核空间的binder_node,desc参数等于1,根据addService的次数递增,并且在service_manager的用户空间中的svclist链表上新建一个svcinfo结构体,其name参数等于服务名字,handle参数等于内核空间中binder_ref.desc=1

(2)addService(服务名称2,xxx)执行后会导致binder驱动在server的内核空间为服务2创建一个binder_node结构体,并且会在service_manager内核空间创建一个binder_ref,其node参数指向server内核空间的新binder_node,desc参数等于2,根据addService的次数递增,并且在service_manager的用户空间中的svclist链表上新建一个svcinfo结构体,其name参数等于服务名字2,handle参数等于内核空间中binder_ref.desc=2

(5)根据收到的ptr和cookie分辨client想使用哪个服务,根据client提交的数据分辨client想使用哪个服务里的函数

service_manager管理服务

()

()

()

client使用服务

(3)getService(“服务名称2”)发给service_manager,在svclist中找到名字相同的srvinfo,得到handle=2,service_manager根据handle=2找到对应的binder_ref,在client内核态创建client进程的binder_ref,其node指向service_manager中找到的binder_ref的node,其实就是指向server进程中对应服务的binder_node,client进程的binder_ref.desc =1,desc的值根据getService的调用递增,把desc=1从内核空间返回给用户空间作为getService的返回值

(4)使用服务构造数据,向handle=1使用ioctl发送数据,进入client的内核态后根据handle=1找到client中对应的binder_ref,进而找到server进程中对应的binder_node,然后找打proc,其表示为server进程,并且把client构造的数据以及server进程中对应的binder_node的ptr和cookie传给server

binder系统分层:

第一层是服务层

C++中实现的服务端:

test_client.cpp中是使用sayhello或者sayhello_to,不关心其实现,实现由BnHelloService.cpp来实现sayhello和sayhello_to做正真的事情

Java中实现的服务端:

TestClient.java中是使用sayhello或者sayhello_to,不关心其实现,实现由HelloService.java来实现sayhello和sayhello_to做正真的事情

第二层是RPC(远程调用)

C++中实现的RPC:

BpHelloService.cpp中实现sayhello和sayhello_to(构造数据、发送数据(remote()->transact()来发送))

BnHelloService.cpp的onTransact根据收到的数据调用sayhello或者sayhello_to

Java中实现的RPC:

IHelloService.java中Stub.Proxy中实现sayhello和sayhello_to(构造数据、发送数据(mRmote.transact))

IHelloService.java中Stub.onTransact接受数据并分析数据调用函数

第三层是IPC(进程间通信)

C++中实现IPC:

怎么发数据?

remote()得到一个Bpbinder对象,最终调用IPCThreadState::self()->transact来发送数据

怎么收数据?

IPC_ThreadState::self()->joinThreadPool()它是一个循环,会调用ioctl读数据

怎么调用到该服务的onTransact函数

在addService("hello",new BnHelloService)注册内核的时候新建的Binder_node.cookie指向这个BnHelloService

server收到数据后取出cookie,转换为binder指针,调用他的transact函数,其又会调用onTransact,其就是派生类BnHelloService实现的函数

Java中怎么实现IPC

怎么发数据?

调用IPCThreadState::self()->transact来发送数据,同时上层是用Java写的,而这里是用的c++,这里面会涉及到JNI过程

怎么收数据?

IPC_ThreadState::self()->joinThreadPool()它是一个循环,会调用ioctl读数据,其也设计到JNI

怎么调用到该服务的onTransact函数

如果使用C++来实现服务,除了IPC层外,其它两层都需要自己来实现;如果使用Java,仅需要实现服务层

9.11 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.3 Binder系统_驱动情景分析_服务获取过程

    4. 服务获取过程 test_client客户端: (1)在用户态先构造name=“hello”的数据(服务的名字是hello),调用ioctl发送数据给service_manager(handle= ...

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

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

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

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

  6. 10.11 android输入系统_补充知识_activity_window_decor_view关系

    android里:1个application, 有1个或多个activity(比如支付宝有:首页.财富.口碑.朋友.我的,这些就是activity)1个activity, 有1个window(每个ac ...

  7. BZOJ_1916_[Usaco2010 Open]冲浪_分层图+拓扑排序+DP

    BZOJ_1916_[Usaco2010 Open]冲浪_分层图+拓扑排序+DP Description 受到秘鲁的马丘比丘的新式水上乐园的启发,Farmer John决定也为奶牛们建 一个水上乐园. ...

  8. mac os x10.11.2系统eclipse无法读取环境变量的问题

    eclipse调试Android自动化脚本的时候一直无法找到adb,遇到这么坑的问题,折腾死了,记录一下. mac os x10.11.2系统GUI程序(eclipse)无法读取~/.bash_pro ...

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

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

随机推荐

  1. nslookup---域名查询

    nslookup命令是常用域名查询工具,就是查DNS信息用的命令. nslookup4有两种工作模式,即“交互模式”和“非交互模式”. 在“交互模式”下,用户可以向域名服务器查询各类主机.域名的信息, ...

  2. 今日题解------codeforces 895C

    题意:给你一个数列,然后找任意数量的数字(除了空集),使得他们的乘机为一个数的平方 我们发现元素最大70,所以我们可以从这里入手,平方数有个性质就是它的所有质因子的指数为偶数 比如:36 = 2*2* ...

  3. 下载编译 Android wear 源代码,尝试制作可穿戴设备功能

    体验 Android Wear 缘由: Android wear 代码公布已经非常久了.一直没有尝试,这里是个编译的过程和步骤,假设要尝试.本文假定读者已经有下载编译 Android  的经验,假设没 ...

  4. 基本3D变换之World Transform, View Transform and Projection Transform

    作者:i_dovelemon 来源:CSDN 日期:2014 / 9 / 28 主题:World Transform, View Transform , Projection Transform 引言 ...

  5. thinkphp杂项功能(主干)

    thinkphp杂项功能(主干) 一.总结 1.杂项功能:杂项里面我需要有点印象的是五个:缓存,多语言,图像处理,文件处理,单元测试 二.thinkphp杂项功能(主干) thinkphp扩展杂项功能 ...

  6. HTTP协议建立连接、通讯与关闭连接全过程

    为解决服务器TimeWait多的问题,了解了一下TCP/IP协议的连接过程.以访问一静态页面为例,从建立连接到访问拿到数据,然后关闭的整个过程.使用EtherPeek截图如下:   图首为一次交互过程 ...

  7. 【2017"百度之星"程序设计大赛 - 初赛(B)】小小粉丝度度熊

    [链接]http://acm.hdu.edu.cn/showproblem.php?pid=6119 [题意] 在这里写题意 [题解] 先把相交的部分合成一个区间. 这个可以用排序,加个简单的处理就能 ...

  8. 多线程中的"断点"续传《notify()和wait()》

    眼下在做一个项目.关于软件管理与下载的,预计项目提交日期定在6月9号.项目做了有20天了,可是在一个功能上卡住了.在这个项目中有一个功能----APK的下载须要实现. 相信大家都玩过非常多关于下载AP ...

  9. Java经典23种设计模式之行为型模式(二)

    本文接着介绍行为型模式里的解释器模式.迭代器模式.中介者模式. 一.解释器模式Interpret 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言的中的句子. 1 ...

  10. COGS——C 14. [网络流24题] 搭配飞行员

    http://cogs.pro/cogs/problem/problem.php?pid=14 ★★☆   输入文件:flyer.in   输出文件:flyer.out   简单对比时间限制:1 s  ...