9.11 Binder系统_分层
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系统_分层的更多相关文章
- 9.2 Binder系统_驱动情景分析_服务注册过程
1. 几个重要结构体的引入给test_server添加一个goodbye服务, 由此引入以下概念: 进程间通信其实质也是需要三要素:源.目的.数据,源是自己,目的用handle表示:通讯的过程是源向实 ...
- 9.4 Binder系统_驱动情景分析_服务使用过程
5. 服务使用过程 test_client进程: 用户态: (1)已结获得了“hello”服务,handle=1; (2)构造数据:code(那个函数)和函数参数 (3)发送ioctl后进入内核态,先 ...
- 9.3 Binder系统_驱动情景分析_服务获取过程
4. 服务获取过程 test_client客户端: (1)在用户态先构造name=“hello”的数据(服务的名字是hello),调用ioctl发送数据给service_manager(handle= ...
- 9.6 Binder系统_驱动情景分析_server的多线程实现
当多个client对server发出请求的时候,如果server忙不过来的时候会创建多线程来处理请求 那么忙不过来由谁来判断? server进程有个binder_proc结构体,其里面有todo链表( ...
- 9.5 Binder系统_驱动情景分析_transaction_stack机制
参考文章:http://www.cnblogs.com/samchen2009/p/3316001.html test_server服务进程可能有多个线程,而在发送数据的时候handle只表示了那个进 ...
- 10.11 android输入系统_补充知识_activity_window_decor_view关系
android里:1个application, 有1个或多个activity(比如支付宝有:首页.财富.口碑.朋友.我的,这些就是activity)1个activity, 有1个window(每个ac ...
- BZOJ_1916_[Usaco2010 Open]冲浪_分层图+拓扑排序+DP
BZOJ_1916_[Usaco2010 Open]冲浪_分层图+拓扑排序+DP Description 受到秘鲁的马丘比丘的新式水上乐园的启发,Farmer John决定也为奶牛们建 一个水上乐园. ...
- mac os x10.11.2系统eclipse无法读取环境变量的问题
eclipse调试Android自动化脚本的时候一直无法找到adb,遇到这么坑的问题,折腾死了,记录一下. mac os x10.11.2系统GUI程序(eclipse)无法读取~/.bash_pro ...
- Android系统--Binder系统具体框架分析(二)Binder驱动情景分析
Android系统--Binder系统具体框架分析(二)Binder驱动情景分析 1. Binder驱动情景分析 1.1 进程间通信三要素 源 目的:handle表示"服务",即向 ...
随机推荐
- 解决wget下载文件名乱码的一些方法
在下载用apache或者nginx做的索引目录时,遇到文件名乱码问题.搜索了不少资料,尝试了好几种方案,大家可以结合使用. 一般情况下加上–restrict-file-names=nocontrol参 ...
- POJ 2457 BFS
题意: 说人话: 从A到B连边 找从1到k的最短路 并输出路径(随便一条即可 ) 如果不能到达 输出-1 思路: 搜 //By SiriusRen #include <queue> #in ...
- Fragment-Transaction 源码分析
概述 这篇文章的简要分析了Activity中的Transaction和add,replace等操作以及backstack的工作原理. 分析transaction源码的原因是因为我在写一个测试代码的时候 ...
- hadoop常用指令
1.格式化名称节点:hadoop namenode -format 2.操作hadoop文件系统:hadoop fs -ls / 3.设置ubuntu默认以命令行方式启动 sudo gedit /et ...
- BZOJ4652: [Noi2016]循环之美(莫比乌斯反演,杜教筛)
Description 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 k 进制下,一个数的小数部分是纯循环的,那么它就是美的.现在,牛牛想知道:对 ...
- 商业模式(二):P2P网贷平台,利差和服务费为主的金融玩法
2014~2015,先后在2家P2P平台工作过,还了解过其它若干武汉P2P平台. 结合自己的工作经历和理财经历,说几句~ 1.P2P网贷这种金融类的创业项目和经营风险,远高于制造业和服务业~ ...
- struct数组初始化
const int MAXN=100; struct A { int a,b; }; struct A arr[100];//此时编译通过 struct A arr[MAXN];//此时编译不通过,原 ...
- Qt 5.11的QChar、QString、QTextBoundaryFinder和双向文本算法现在完全兼容Unicode 10
本文翻译自:Qt 5.11 released 原文作者: Qt公司CTO兼Qt开源项目维护官Lars Knoll翻译校审:Richard.Hongfei.Haipeng 5月22日,我们提发布了Qt ...
- 一些VPS
https://www.perfectip.net 5美元/1C/4G/20G/10Thttps://www.hetzne ...
- js14--原型2
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...