Binder通信原理与弊端解析

news2024/9/27 12:16:45

Binder 定义

简单来说,Binder 就是用来Client 端和 Server 端通信的。并且 Client 端和 Server 端 可以在一个进程也可以不在同一个进程,Client 可以向 Server 端发起远程调用,也可以向Server传输数据(当作函数参数来传),并且不用关心对方在哪个进程。

Binder的基本原理

Binder借助了内存映射(mmap)的方法,在内核空间和接收方用户空间的数据缓存区之间做了一层内存映射。从发送方用户空间拷贝到内核空间缓存区的数据,就相当于直接拷贝到了接收方用户空间的数据缓存区,从而减少了一次数据拷贝。

设计夸进程通信所关注的点有哪些

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O4uNyS1N-1678366714274)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/44939d589c264326bc5ac43d543b8279~tplv-k3u1fbpfcp-zoom-1.image)]

如果使用 Linux 提供的夸进程通信方式来看,流程如上图,Client 端通过函数传参序列化成 buffer,然后通过 Linux提供的如 Socket ,管道,等通信方式进行传输,然后到 Server端进行解析。

像早期的电话总机接线员,我们想打个电话,先打到总机告诉接线员我要打到哪里,接线员再把电话转接过去,这样的方式即麻烦,采用人工的方式,效率慢,还需要先接收再转接,还不安全。理想的跨进城通信方式要保证 性能好、使用方便、安全 等需求,binder 和其他方式对比就满足了这些要求。

Binder 的意义

  • Binder 并不是 Linux 提供的跨进程机制,它是跑在驱动层的跨进程方式,它是数据内核太,并没有使用 Linux 的跨进程通信方式(socket,pipe,共享内存…)
  • 性能:Linux 提供的socket、pipe 是需要内核来做中转,相当于两次数据拷贝,一次是从应用层拷贝到内核,一次是从内核拷贝到应用层。Binder 是有开辟一块物理内存,同时影射到内存和用户空间,所以当你把数据拷贝到内核空间时也就相当于拷贝到了应用空间了。
  • 方便易用:逻辑简单直接,不容易出问题,共享内存虽然性能很好,但是用起来比较复杂,没有 binder 好用。
  • 安全:普通的 Linux 的跨进程通信方式并不是很安全,比如 socket 它的 ip 地址都是开放的,只要知道 ip 就可以去连接访问了。主要我们拿不到调用方可靠的信息,可靠的信息只能在IPC内核态的时候添加好,不能让调用方自己添加。

binder 的通信架构

上图是展示的系统服务的 binder 通信,因为只有系统服务才能注册到 ServiceManager 中,应用的服务是无法注册到 ServiceManager 中的,通过不了权限验证。Client 是应用进程,Server 是系统服务(可能跑在 SystemServer 进程,也可能是单独进程)ServiceManager是一个单独的进程。无论是 Client 还是 Server 还是 ServiceManager,第一步都是需要先启动 binder 机制。

binder 通信

从ServiceManager开始,通过一系列的启动和准备,最后会进入 loop 循环等待Client 和 server 端的消息。具体逻辑可以查看ServiceManager 的作用、启动流程和工作原理。

上图 Server 端一般是系统服务,Client 一般是应用服务,所以一般显示 Server 先和 ServiceManager 交互,系统服务是如何注册到 ServiceManager 中的可以查看 怎样添加一个Android的系统服务?。

binder 驱动的分层架构图

binder 通信弊端

传统Linux IPC机制的缺点

性能角度

管道、消息队列、Socket实现一次进程通信都需要2次内存拷贝,效率太低;

共享内存虽然不需要拷贝内存,但管理复杂;

Binder只需要一次内存拷贝,从性能角度来看,低于共享内存方式,优于其它方式。

IPC数据拷贝次数
share mm0
Binder1
pipe MQ SOCKET2

安全性考虑

a. 传统的IPC机制没有安全措施,接收方无法获得对方可靠的进程ID或用户ID,比如Socket通信的IP地址是客户端填入的,很可能被恶意程序篡改。

b. Android作为面向终端用户的开源平台,因此安全性极为重要。Android系统为每个已安装的App都分配了用户ID(UID),UID是鉴别进程身份的重要标识,通过UID可以进行一系列的权限校验。

c. 传统IPC的接入点是开放的,任何程序都可以根据协议进行访问,无法阻止恶意程序的访问。

综上所述:

Android需要一种基于C/S架构的IPC机制,Server端需要能够对Client的请求进行身份校验,来保证数据的安全性。

Binder驱动是一种虚拟的字符设备,注册在/dev/binder中,其定义了一套Binder通信协议,负责建立进程间的Binder通信,提供了数据包在进程之间传递的一系列底层支持。应用进程访问Binder驱动也是通过系统调用实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

USART_GetITStatus与 USART_GetFlagStatus的区别

文章目录共同点不同点USART_GetITStatus函数详解USART_GetFlagStatus函数共同点 都能访问串口的SR寄存器 不同点 USART_GetFlagStatus(USART_TypeDef USARTx, uint16_t USART_FLAG):* 该函数只判断标志位(访问串口的SR寄存器)。在没有使能…

TwinCAT3中ModbusTCP Server和C# Client连接

目录 一、硬件环境 1、设置PLC的ip地址 2、ModbusTCP软件安装 3、PLC操作系统防火墙设置 4、网络助手连接PLC 二、创建PLC工程 1、创建寄存器读写变量 2、添加ModbusTCP授权 3、激活和运行工程 三、ModbusTCP数据协议说明 1、写单个寄存器 2、读寄存器 (1&…

反转链表相关的练习(下)

目录 一、回文链表 二、 重排链表 三、旋转链表 一、回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输…

安装mayavi的成功步骤

这篇文章是python 3.6版本,windows系统下的安装,其他python版本应该也可以,下载对应的包即可。 一定不要直接pip install mayavi,这个玩意儿对vtk的版本有要求。 下载whl包 搞了很久不行,咱也别费那个劲了&#xff0…

【2023】某python语言程序设计跟学第三周内容

目录1.数字类型与操作:整数:浮点数:复数数值运算操作符数字之间关系数值运算函数2.案例:天天向上的力量第一问:1‰的力量第二问:5‰和1%的力量第三问:工作日的力量第四问:工作日的努…

Dynamics365 本地部署整体界面

昨天已经登陆上去了然后今天开机突然又登陆不上去了 具体原因也不知道 然后我把注册插件删除又重新下载结果还是登陆不上去于是返回之前的断点就可以登陆上去了重复昨天的操作这里就不截图了6、注册新步骤右键单击(插件)BasicPlugin.FollowUpPlugin&…

MySQL 主备一致

MySQL 主备一致主备切换binlog 格式statementrowmixed生产格式循环复制问题主备切换 MySQL 主备切换流程 : 状态 1 : 客户端的读写都直接访问节点 A,而节点 B 是 A 的备库,只将 A 的更新都同步过来 , 并本地执行。来保持节点 B 和 A 的数据是相同当切换…

Python蓝桥杯训练:基本数据结构 [二叉树] 中

Python蓝桥杯训练:基本数据结构 [二叉树] 中 文章目录Python蓝桥杯训练:基本数据结构 [二叉树] 中一、[翻转二叉树](https://leetcode.cn/problems/invert-binary-tree/)二、[对称二叉树](https://leetcode.cn/problems/symmetric-tree/)三、[二叉树的最…

Vue3这样子写页面更快更高效

在开发管理后台过程中,一定会遇到不少了增删改查页面,而这些页面的逻辑大多都是相同的,如获取列表数据,分页,筛选功能这些基本功能。而不同的是呈现出来的数据项。还有一些操作按钮。 对于刚开始只有 1,2 个页面的时候大多数开发者可能会直接将之前的页面代码再拷贝多…

工作记录:调研monorepo和微前端

2023年1月。因工作项目需要,调研 monorepo 、微前端等技术。 任务 一直在做的 BI 项目,随着需求迭代,模块越来越多,项目越来越复杂、臃肿。 最近,前一阶段的开发工作基本结束。新模块还在设计阶段。借此契机&#xf…

进阶C语言——数据的存储【详解】

文章目录1. 数据类型介绍1.1 类型的基本归类2. 整形在内存中的存储2.1 原码、反码、补码2.2 大小端介绍2.3 练习3. 浮点型在内存中的存储3.1 一个例子3.2 浮点数存储的规则1. 数据类型介绍 前面我们已经学习了基本的内置类型: char //字符数据类型 short //短整型 …

学习ForkJoin

学习ForkJoin一、普通解决多线程方式1、案例一2、效果图二、ForkJoin一、普通解决多线程方式 1、案例一 大数据量的List问题处理,多线程分批处理,需要解决的问题: 下标越界。线程安全。数据丢失。 private static ThreadPoolExecutor thre…

链表OJ之 快慢指针法总结

欢迎来到 Claffic 的博客 💞💞💞 前言: 快慢指针指的是每次指针移动的步长,是解决链表相关的题目的一大利器,下面我将以例题的形式讲解快慢指针法。 目录 一. 链表的中间结点 思路: 代码实…

GMP调度模型总结

优秀文章 什么是GMP调度模型 Golang的一大特色就是Goroutine。Goroutine是Golang支持高并发的重要保障。Golang可以创建成千上万个Goroutine来处理任务,将这些Goroutine分配、负载、调度到处理器上采用的是G-M-P模型。 什么是Goroutine Goroutine Golang Coro…

云舟案例︱视频孪生技术赋能城市安全综合管理场景,提升城市数智化水平

随着城市化发展进程的加快,人口不断膨胀,社会安全隐患等问题日益突出,成为困扰城市建设与管理的重要难题。针对各类社会治安突出问题,城市管理部门积极推进城市信息化建设,视频监控等各类信息化采集手段为城市数字化管…

嵌入式学习笔记——使用寄存器编程实现按键输入功能

文章目录前言模块介绍原理图编程思路前言 昨天,通过配置通用输出模式,实现了LED灯的点亮、熄灭以及流水等操作,解决了通用输出的问题,今天我们再借用最常见的输入模块,按键来实现一个按键控制LED的功能,重…

SpringBoot【知识加油站】---- REST开发

SpringBoot【知识加油站】---- REST开发1. REST 简介2. REST 风格3. RESTful 入门案例1. REST 简介 REST:Representaional State Transfer,表现形式状态转换 传统风格资源描述形式 http://localhost/user/getById?id1 http://localhost/user/saveUser…

91. 解码方法 ——【Leetcode每日刷题】

91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : ‘A’ -> “1” ‘B’ -> “2” … ‘Z’ -> “26” 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法&#xff0…

Kubernetes13:Ingress

Kubernetes13:Ingress 1、把端口号对外暴露,通过ip端口号进行访问 使用Service里面的NodePort实现(Cluster、LoadBanlancer、NodePort) 2、NodePort缺陷 在每个节点上启动一个端口,在访问时候通过任何节点&#xf…

MySQL(五)锁

锁全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁&临键锁总结计算机用锁来协调多个进程或线程并发访问某一资源。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并…