binder机制原理android,Binder机制1---Binder原理介绍

article/2025/10/29 0:39:26

1.Binder通信机制介绍

这篇文章会先对比Binder机制与Linux的通信机制的差别,了解为什么Android会另起炉灶,采用Binder。接着,会根据 Binder的机制,去理解什么是Service  Manager,在C/S模型中扮演什么角色。最后,会从一次完整的通信活动中,去理解Binder通信的过程。

1.1 Android与Linux通信机制的比较

虽然Android继承使用Linux的内核,但Linux与Android的通信机制不同。

在Linux中使用的IPC通信机制如下:传统IPC:无名pipe, signal, trace, 有名管道

AT&T Unix 系统V:共享内存,信号灯,消息队列

BSD Unix:Socket

而在Android中,并没有使用这些,取而代之的是Binder机制。Binder机制是采用OpenBinder演化而来,在Android中使用它的原因如下:采用C/S的通信模式。而在linux通信机制中,目前只有socket支持C/S的通信模式,但socket有其劣势,具体参看第二条。

有更好的传输性能。对比于Linux的通信机制,socket:是一个通用接口,导致其传输效率低,开销大;

管道和消息队列:因为采用存储转发方式,所以至少需要拷贝2次数据,效率低;

共享内存:虽然在传输时没有拷贝数据,但其控制机制复杂(比如跨进程通信时,需获取对方进程的pid,得多种机制协同操作)。

安全性更高。Linux的IPC机制在本身的实现中,并没有安全措施,得依赖上层协议来进行安全控制。而Binder机制的 UID/PID是由Binder机制本身在内核空间添加身份标识,安全性高;并且Binder可以建立私有通道,这是linux的通信机制所无法实现的 (Linux访问的接入点是开放的)。

综上所述,Android采用Binder机制是有道理的。既然Binder机制这么多优点,那么我们接下来看看它是怎样通过C/S模型来实现的。

1.2 Binder在Service服务中的作用

在android中,有很多Service都是通过binder来通信的,比如MediaServer旗下包含了众多service:AudioFlinger 音频核心服务

AudioPolicyService:音频策略相关的重要服务

MediaPlayerService:多媒体系统中的重要服务

CameraService:有关摄像/照相的重要服务

Binder在C/S中的流程如下:

c5f7aa65ca7e9ec14054e9770aea091d.pngServer注册服务。Server作为众多Service的拥有者,当它想向Client提供服务时,得先去Service Manager(以后缩写成SM)那儿注册自己的服务。Server可以向SM注册一个或多个服务。

Client申请服务。Client作为Service的使用者,当它想使用服务时,得向SM申请自己所需要的服务。Client可以申请一个或多个服务。

当Client申请服务成功后,Client就可以使用服务了。

SM一方面管理Server所提供的服务,同时又响应Client的请求并为之分配相应的服务。扮演的角色相当于月老,两边牵线。这种通信方式的好处是: 一方面,service和Client请求便于管理,另一方面在应用程序开发时,只需为Client建立到Server的连接,就可花很少时间和精力去实 现Server相应功能。那么,Binder与这个通信模式有什么关系呢?!其实,3者的通信方式就是Binder机制(例如:Server向SM注册服 务,使用Binder通信;Client申请请求,用的是Binder通讯)

1.3 Binder通信机制流程(整体框架)

d763f49a2384bc0f479aa9abc93d85a1.png

上图即是Binder的通信模型。我们可以发现:Client和Server是存在于用户空间

Client与Server通信的实现,是由Binder驱动在内核空间实现

SM作为守护进程,处理客户端请求,管理所有服务项。

为了方便理解,我们可以把SM理解成DNS服务器; 那么Binder Driver 就相当于路由的功能。这里就涉及到Client和Server是如何通信的问题。下面对1.2中提到的3个流程进行说明。

1.3.1 Server向SM注册服务

5143e624946e79b49cc3f51a71b7ee35.png首先,XXXServer(XXX代表某个)在自己的进程中向Binder驱动申请创建一个XXXService的Binder的实体,

Binder驱动为这个XXXService创建位于内核中的Binder实体节点以及Binder的引用,注意,是将名字和新建的引用打包传递给SM(实体没有传给SM),通知SM注册一个名叫XXX的Service。

SM收到数据包后,从中取出XXXService名字和引用,填入一张查找表中。

此时,如果有Client向SM发送申请服务XXXService的请求,那么SM就可以在查找表中找到该Service的Binder引用,并把Binder引用(XXXBpBinder)返回给Client。

在进一步了解Binder通信机制之前,我们先弄清几个概念。引用和实体。这里,对于一个用于通信的实体(可以理解成具有真实空间的Object),可以有多个该实体的引用(没有真实空间,可以理解成实体的 一个链接,操作引用就会操作对应链接上的实体)。如果一个进程持有某个实体,其他进程也想操作该实体,最高效的做法是去获得该实体的引用,再去操作这个引 用。

有些资料把实体称为本地对象,引用成为远程对象。可以这么理解:引用是从本地进程发送给其他进程来操作实体之用,所以有本地和远程对象之名。

1.3.2 一个问题-如何获得SM的远程接口

7edb0116a7bd602a419a7476278e1c42.png

如果你足够细心,会发现这里有一个问题:

Sm和Server都是进程,Server向SM注册Binder需要进程间通信,当前实现的是进程间通信却又用到进程间通信。这就好比鸡生蛋、蛋生鸡,但至少得先有其中之一。

巧妙的Binder解决思路:

针对Binder的通信机制,Server端拥有的是Binder的实体;Client端拥有的是Binder的引用。

如果把SM看作Server端,让它在Binder驱动一运行起来时就有自己的Binder实体(代码中设置ServiceManager的Binder 其handle值恒为0)。这个Binder实体没有名字也不需要注册,所有的client都认为handle值为0的binder引用是用来与SM通信 的(代码中是这么实现的),那么这个问题就解决了。那么,Client和Server中这么达成协议了(handle值为0的引用是专门与SM通信之用 的),还不行,还需要让SM有handle值为0的实体才算大功告成。怎么实现的呢?!当一个进程调用Binder驱动时,使用 BINDER_SET_CONTEXT_MGR命令(在驱动的binder_ioctl中)将自己注册成SM时,Binder驱动会自动为它创建 Binder实体。这个Binder的引用对所有的Client都为0。

1.3.3 Client从SM获得Service的远程接口

e6c77386b14bd72967f9be4de3872316.png

Server向SM注册了Binder实体及其名字后,Client就可以通过Service的名字在SM的查找表中获得该Binder的引用了 (BpBinder)。Client也利用保留的handle值为0的引用向SM请求访问某个Service:我申请访问XXXService的引用。 SM就会从请求数据包中获得XXXService的名字,在查找表中找到该名字对应的条目,取出Binder的引用打包回复给client。之 后,Client就可以利用XXXService的引用使用XXXService的服务了。

如果有更多的Client请求该Service,系统中就会有更多的Client获得这个引用。

1.3.4 建立C/S通路后

ca26c811b2dfa534fb7614bbfc49e6d8.png

首先要理清一个概念:client拥有自己Binder的实体,以及Server的Binder的引用;Server拥有自己Binder的实体,以及Client的Binder的引用。我们也可以从接收方和发送方的方式来理解:从client向Server发数据:Client为发送方,拥有Binder的实体;Server为接收方,拥有Binder的引用

从server向client发数据:Server为发送方,拥有Binder的实体;client为接收方,拥有Binder的引用。

也就是说,我们在建立了C/S通路后,无需考虑谁是Client谁是Server,只要理清谁是发送方谁是接收方,就能知道Binder的实体和引用在哪边。

建立CS通路后的流程:(当接收方获得Binder的实体,发送方获得Binder的引用后)发送方会通过Binder实体请求发送操作。

Binder驱动会处理这个操作请求,把发送方的数据放入写缓存(binder_write_read.write_buffer) (对于接收方为读缓冲区),并把read_size(接收方读数据)置为数据大小(对于具体的实现后面会介绍);

接收方之前一直在阻塞状态中,当写缓存中有数据,则会读取数据,执行命令操作

接收方执行完后,会把返回结果同样用binder_transaction_data结构体封装,写入写缓冲区(对于发送方,为读缓冲区)

1.3.5 匿名Binder

49ff2c83c8160fe85c3e6e869c7f3eb1.png

之前在介绍Android使用Binder机制的优点中,提到Binder可以建立点对点的私有通道,匿名Binder就是这种方式。在 Binder通信中,并不是所有用来通信的Binder实体都需要注册给SM广而告之的,Server可以通过已建立的实体Binder连接将创建的 Binder实体传给Client。而这个Binder没有向SM注册名字。这样Server与Client的通信就有很高的隐私性和安全性。

这样,整个Binder的通信流程就介绍完毕了,但是对于具体的代码实现(比如binder_transaction_data是什 么?binder_write_read.write_buffer又是什么?具体的驱动和逻辑实现又是怎么样?),在后面章节中会一一介绍。

几点疑问:

1. 是谁,怎么样成为SM守护进程,handle为0的binder实体什么时候创建?

2.  binder引用和实体是如何创建的?在驱动中如何实现的通信?

3. 在SM中,binder实体是怎样转换成为引用的?

4. Server是如何注册服务,Client是如何获取服务的?

读完后续文章就会知道答案了!


http://chatgpt.dhexx.cn/article/dyjeHxab.shtml

相关文章

理解Binder机制

前言 ​ Android中Binder机制的重要性不言而喻,从IPC角度来看, Binder是一种跨进程通信方式,Binder也可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder;从Android framework角度来说,Binder是Serv…

Android--Binder机制

Android--Binder机制 1.简介 Binder是什么? 机制:Binder是一种进程间通信的机制 驱动:Binder是一个虚拟物理设备驱动 应用层:Binder是一个能发起进程间通信的JAVA类 Binder就是Android中的血管,在Android中我们使用…

Binder 机制

Binder 是 Android 系统进程间通信(IPC:Internet Process Connection)方式之一。Linux 已经拥有的 IPC 手段包括: 管道(Pipe)、信号(Signal)、跟踪(Trace)、插…

Android Binder机制

Android Binder机制 什么是BinderBinder一般的IPC原理动态内核可加载模块内存映射运行机制四大角色注册服务使用服务 对象的传递Binder通信 什么是Binder 要理解binder,先要知道IPC,Inter-process communication ,也就是进程中相互通信,Bind…

Binder机制

直观来讲,Binder是Android中的一个类,它实现了IBinder接口。从IPC角度来看,Binder是Android中一种跨进程通信方式,Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在Linux中没…

Binder机制原理

前言 本篇文章记录本人对Binder的学习,因为本人能力有限,若有错误,还请批评指正。 binder的使用文章推荐 1.Binder是什么? 可以理解是为Android的血管。是一种进程间通信的机制。比如Activity,Service需要和AMS通信…

Binder机制(非常好理解)

Binder是一种进程间通信机制,用来实现不同进程之间的通信。 Binder机制主要由四大块组成,分别是客户空间的client、server,serverManager,还有内核的Binder驱动。 下面我先看下图,利于理解Binder内部工作机制&#x…

Android进程间通信之一:Binder机制学习

Binder机制学习 Binder驱动Binder核心APILinux 使用两级保护机制:0 级供系统内核使用,3 级供用户程序使用。 Linux 下的传统 IPC 通信原理Linux 下的传统 IPC 通信原理Binder通信过程ServiceManager进程启动MMAP Binder驱动 binder驱动在以misc设备进行注…

Android跨进程通信:图文详解 Binder机制 原理

前言 如果你接触过 跨进程通信 (IPC),那么你对Binder一定不陌生虽然 网上有很多介绍 Binder的文章,可是存在一些问题:浅显的讨论Binder机制 或 一味讲解 Binder源码、逻辑不清楚,最终导致的是读者们还是无…

操作系统实验五--存储管理

文章目录 操作系统实验五--存储管理一、实验目的二、实验内容三、设计原理及相关算法四、结果分析五、源代码 操作系统实验五–存储管理 一、实验目的 1、了解虚拟存储技术的特点,掌握请求页式存储管理的主要页面置换算法原理。 2、掌握请求页式存储管理中页面置…

操作系统实验—存储管理

操作系统实验—存储管理 所有实验源码: gitee:https://gitee.com/infiniteStars/os-project github:https://github.com/helloworldzsq/OSproject 1.实验内容 设计一个虚拟存储区和内存工作区,并使用下述方法计算访问命中率。 ①…

操作系统实验——磁盘调度算法

文章目录 前言一、实验目的二、实验内容和要求三、实验程序四、运行结果运行结果截图 五、思考和分析程序实现(思路):分析几种算法: 附 前言 提示:本次实验在Linux(Ubuntu)中运行,程序中读取的文件需放在与c文件同一个文件夹中&a…

北航操作系统实验入门

有北航操作系统实验平台账号的部分读者反映不会操作。为了让读者尽快了解实验平台的操作,下面介绍lab0的实验步骤,希望读者能尽快掌握实验平台的使用方法。 1. 用学生账号登录 2. 点击【操作系统实验】进入实验界面 3. lab0实验环境介绍,仔细…

操作系统实验三进程间通信

文末也可直接获取实验文档 实验三 进程间通信 目录 1实验目的2 实验内容3实验详细操作步骤及程序清单:4相关问题及思考5总结6背景知识 1实验目的 1、了解linux系统中进程通信的基本原理。 2、分析进程竞争资源现象,学习解决进程互斥的方法。 2 实验内…

操作系统实验——进程控制

操作系统实验——进程控制 预习内容: 1.进程的概念 ⑴程序的并发执行 ⑵进程的定义 2.进程的描述 ⑴进程控制块 ⑵进程上下文 ⑶进程上下文切换 ⑷进程空间与大小 3. 进程状态及其转换 ⑴进程状态 ⑵进程状态转换 4.进程控制 ⑴进程创建与撤销 ⑵进程的阻塞与唤醒…

操作系统实验一

操作系统实验一 进程调度算法 一、实验目的 1.理解操作系统进程管理中进行进程调度的过程和调度算法的思想原理; 创建进程控制块PCB,并合理组织就绪队列。 2.理解进程的状态及变化,动态显示每个进程的当前状态及进程的调度情况。 掌握几…

操作系统实验一·创建进程

创建进程 1实验目的2实验内容:2.1Windows实现2.2Linux实现 3实验环境3.1Windows3.2Linux虚拟机 4程序设计和实现4.1Windows实现4.1.1函数解释4.1.2程序代码4.1.3运行结果 4.2Linux实现4.2.1函数解释4.2.2程序代码4.2.3运行结果 Use system calls to implement a “m…

操作系统实验

实验一 命令解释程序 实验内容 利用C语言编写一个微型命令解释程序minishell.c,该程序可接收并解释以下命令: (1) dir 列出当前目录 (2) cop file1 file2 拷贝文件 (3) era filename 删除文件 (4) disp string 显示字符串 (5) end 结束,退出…

操作系统实验报告

操作系统 一、实验一 通过 VMware 虚拟机软件安装 Linux二、实验目的三、实验内容(实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键源代码)四、实验结果与分析五、小结与心得体会 一、实验二 Windows 进程管理二、实验目的三、实验内容&…

操作系统实验——银行家算法

文章目录 一、实验目的二、实验内容和要求三、实验原理算法实现 四、实验程序代码如下: 五、验证数据和运行结果运行结果截图 六、思考与分析附 一、实验目的 掌握银行家算法思想,并能编程实现。 二、实验内容和要求 1、在Linux环境下编译运行程序&am…