9.10 Binder系统_分层

Posted liusiluandzhangkun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9.10 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.10 Binder系统_分层的主要内容,如果未能解决你的问题,请参考以下文章

第5课第1节_Binder系统_C程序示例_框架分析

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

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

9.13 Binder系统_Java实现_内部机制_Server端

9.2 Binder系统_驱动情景分析

IPC_Binder_java_2