Binder机制原理学习笔记(3)_Binder机制整体架构和通信流程

Binder整体架构

Binder 通信采用 C/S 架构,核心包含 Client、 Server、 ServiceManager 以及 Binder 驱动。其中Server,Client,ServiceManager 运行于用户空间,驱动运行于内核空间。
ServiceManager 用于管理系统中的各种服务。
Binder使用了面向对象的思想来描述作为访问接入点的Binder及其在Client中的入口:Binder是一个实体位于Server中的对象,该对象提供了一套方法用以实现对服务的请求,就象类的成员函数。
遍布于client中的入口可以看成指向这个binder对象的‘指针’,一旦获得了这个‘指针’就可以调用该对象的方法访问server。在Client看来,通过Binder‘指针’调用其提供的方法和通过指针调用其它任何本地对象的方法并无区别,尽管前者的实体位于远端Server中,而后者实体位于本地内存中。
‘指针’是C++的术语,而更通常的说法是引用,即Client通过Binder的引用访问Server。而软件领域另一个术语‘句柄’也可以用来表述Binder在Client中的存在方式。从通信的角度看,Client中的Binder也可以看作是Server Binder的‘代理’,在本地代表远端Server为Client提供服务。

Binder机制原理学习笔记(3)_Binder机制整体架构和通信流程_第1张图片

Binder通信流程

一. Server端向ServiceManager注册服务,ServiceManager有一个全局的service列表svcinfo,用来缓存所有服务的handlername
二. 客户端与服务端通信,需要拿到服务端的对象,由于进程隔离,客户端拿到的其实是服务端的代理,也可以理解为引用。客户端通过ServiceManagersvcinfo中查找服务,ServiceManager返回服务的代理。
三、获取到Server端的服务对象,就可以向此目标对象发送数据了,Client端通过BinderProxy 将请求参数发送给内核,通过共享内存的方式使用内核方法copy_from_user()将请求参数先拷贝到内核空间,这时客户端进入等待状态。然后 Binder 驱动向服务端的 todo 队列里面插入一条事务,执行完之后把执行结果通过copy_to_user() 将内核的结果拷贝到用户空间(这里只是执行了拷贝命令,并没有拷贝数据,binder只进行一次拷贝),唤醒等待的客户端并把结果响应回来,这样就完成了一次通讯。
Binder机制原理学习笔记(3)_Binder机制整体架构和通信流程_第2张图片

Binder中各角色之间关系

Binder机制原理学习笔记(3)_Binder机制整体架构和通信流程_第3张图片
1、Binder实体
Binder实体,是各个Server以及ServiceManager在内核中的存在形式。

Binder实体实际上是内核中binder_node结构体的对象,它的作用是在内核中保存Server和ServiceManager的信息(例如,Binder实体中保存了Server对象在用户空间的地址)。简言之,Binder实体是Server在Binder驱动中的存在形式,内核通过Binder实体可以找到用户空间的Server对象。

在上图中,Server和ServiceManager在Binder驱动中都对应的存在一个Binder实体。

2、Binder引用\代理

说到Binder实体,就不得不说"Binder引用"。所谓Binder引用,实际上是内核中binder_ref结构体的对象,它的作用是在表示"Binder实体"的引用。换句话说,每一个Binder引用都是某一个Binder实体的引用,通过Binder引用可以在内核中找到它对应的Binder实体。

如果将Server看作是Binder实体的话,那么Client就好比Binder引用。Client要和Server通信,它就是通过保存一个Server对象的Binder引用,再通过该Binder引用在内核中找到对应的Binder实体,进而找到Server对象,然后将通信内容发送给Server对象。

Binder实体和Binder引用都是内核(Binder驱动)中的数据结构。每一个Server在内核中就表现为一个Binder实体,而每一个Client则表现为一个Binder引用。这样,每个Binder引用都对应一个Binder实体,而每个Binder实体则可以多个Binder引用。

3、远程服务
Server都是以服务的形式注册到ServiceManager中进行管理的。如果将Server本身看作是"本地服务"的话,那么Client中的"远程服务"就是本地服务的代理。远程服务就是本地服务的一个代理,通过该远程服务Client就能和Server进行通信。

4、ServiceManager守护进程
ServiceManager是用户空间的一个守护进程。当该应用程序启动时,它会和Binder驱动进行通信,告诉Binder驱动它是服务管理者;对Binder驱动而言,它则会新建ServiceManager对应的Binder实体,并将该Binder实体设为全局变量。

https://blog.csdn.net/yiranfeng/article/details/105181297?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-17.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-17.nonecase

你可能感兴趣的:(Android)