当前位置: 首页 > news >正文

Binder通信原理与弊端解析

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.lryc.cn/news/35896.html

相关文章:

  • 网络使用情况监控
  • 业务流程图TFD和数据流程图DFD例题
  • react框架基础入门
  • C++ ,JNI, Java 数据传递全解(一)
  • 【Unity逆向】玩游戏遇到的“飞天锁血”是怎么实现的?
  • Spring基础与创建
  • 虚拟机系列教程:虚拟机克隆
  • iperf3主页官方信息
  • Linux-0.11 kernel目录进程管理sched.c详解
  • AI已到,普通人的机会在哪里?
  • CSP-J2022入门组二轮补赛试题(山东)T2:宴会
  • ubuntu 使用 CMake 构建 Qt5 项目
  • ZooKeeper命令及JavaAPI操作
  • 云医疗信息系统源码(云HIS)商业级全套源代码
  • u盘拔掉再插上去文件没了原因|文件恢复方法
  • CorelDRAW2023详解新增七大功能 ,CorelDRAW2023最新版本更新怎么样?
  • LearnOpenGL-光照-4.光照贴图
  • ThreadLocal解析
  • 时间格式表
  • enscape和twinmotion哪个好用?
  • Canvas
  • 旅游预约APP开发具有什么优势和功能
  • Python之函数参数细讲
  • 跑步耳机入耳好还是不入耳好、十大跑步运动耳机品牌排行榜推荐
  • Go语言容器之数组和切片
  • 【ROS2知识】humble下使用插件编程
  • MySQL 主备一致
  • 玩转CodeQLpy之用友GRP-U8漏洞挖掘
  • GMP调度模型总结
  • 蓝桥回文日期题