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表示"服务",即向 ...
随机推荐
- deep-in-es6(四)
不定参数和默认参数: function containsAll(str) { for(var i = 1;i < arguments.length;i++) { var hasStr = arg ...
- 【DRF频率】
目录 使用自带的频率限制类 使用自定义的频率限制类 开发平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. DRF就为我们提供了一些频率限制的方法. DRF中的版本.认证.权限 ...
- 解决Docker容器内访问宿主机MySQL数据库服务器的问题
懒得描述太多,总归是解决了问题,方法简要记录如下,虽然简要,但是完整,一来纪念处理该问题耗费的大半天时间,二来本着共享精神帮助其他遇到该问题的哥们儿,当然这个方法并不一定能解决你们的问题,但是多少能提 ...
- FZU 1962 新击鼓传花游戏
新击鼓传花游戏 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on FZU. Original ID: 19 ...
- IE兼容性开发的笔记
当前项目组开发的产品对外承诺支持IE9和IE11,但在推广应用过程中发现存在相当比例的用户实际上还在使用IE8.而这相当比例中的用户还包含了大部分的公司领导.为了满足公司内部各阶层人士体验我们产品的诉 ...
- js05---js实现Map
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- widget-移除底部小部件内容
今天有一个要求,就是在调出手机窗口小部件的时候,让其中的某些小部件不显示.折腾了好久,虽然不知道原理,最终还是实现了屏蔽其中个别小部件的方法.记录下来 要想屏蔽底部小部件的显示,只需要把相关的类跟广播 ...
- ReactJs 入门DEMO(转自别人)
附件是分享的一些他人的ReactJs入门DEMO,以前版本使用的是JSXTransformer.js,新版的用browser.min.js替代了. DEMO 下载地址:http://files.cnb ...
- Servlet简单注解方式使用
我们是用Servlet进行跳转的时候都需要去web.xml中进行配置,分繁琐. 那么今天就学习下使用注解方式配置servlet一样好使 package com.shxt.servlet; import ...
- View源码分析如何创建
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/jj120522 博主导读:View是Android中最重要的控件,几乎所有的控件都与View相 ...