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. pix格式的摸索(二)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 PCI的系统格式pix是一个设计很巧妙的遥感图像格式,而且其设计巧妙之处不止一处两处,这些都有待我日后一一去摸索.今天 ...

  2. Linux系统下到哪儿寻找硬件错误

    Linux系统下到哪儿寻找硬件错误       当linux系统出现故障的时候,作为管理员首先要定位错误,现在linux有许多工具都能帮助用户寻找错误,要学会利用他们确定问题.这些工具包括dmesg. ...

  3. 【canvas】跟随鼠标的星空连线

    2019-01-23 19:57:38 挂一个比较简单的一个canvas应用,利用CPU进行粒子实时计算,直接面向过程写的 帧动画:浏览器在下一个动画帧安排一次网页重绘,  requestAnimat ...

  4. 一个简易版的Angular js 三层 示例

    var myApp = angular.module('produceline', []); myApp.factory('ajax', ["$http", "$q&qu ...

  5. idea git ignore 插件

    https://blog.csdn.net/qq_34590097/article/details/56284935

  6. 洛谷——P1307 数字反转

    https://www.luogu.org/problem/show?pid=1307#sub 题目描述 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原 ...

  7. 洛谷 P1827 美国血统 American Heritage

    P1827 美国血统 American Heritage 题目描述 农夫约翰非常认真地对待他的奶牛们的血统.然而他不是一个真正优秀的记帐员.他把他的奶牛 们的家谱作成二叉树,并且把二叉树以更线性的“树 ...

  8. RGB 颜色空间转 HSI 颜色空间的matlab程序实现

    RGB 颜色空间转 HSI 颜色空间的matlab程序实现 2014.10.20之前的内容有误,这里依据wikipedia更新了算法内容. 算法以wiki为准 https://en.wikipedia ...

  9. hdu4336Card Collector 概率dp+状态压缩

    //给n个卡片每次出现的概率,求全部卡片都出现的须要抽的次数的期望 //dp[i]表示在状态的情况下到全部的卡片都出现的期望 //dp[i] = 1 + p1*dp[i] + ${p2[j]*dp[i ...

  10. BZOJ 3456 城市规划 ( NTT + 多项式求逆 )

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 题意: 求出\(n\)个点的简单(无重边无自环)无向连通图的个数.(\(n< ...