Binder机制详解(三)

2023-11-15

系列目录

Binder机制详解(一)

Binder机制详解(二)


前言

前两节学习了Binder机制需要储备的底层知识,接下来会分四层详细讲解Binder机制


一、Binder机制理解

binder 是 Android 中主要的跨进程通信方式,binder 驱动和 service manager 分别相当于网络协议中的路由器和 DNS,并基于 mmap 实现了 IPC 传输数据时只需一次拷贝。

binder 包括 BinderProxy、BpBinder 等各种 Binder 实体,以及对 binder 驱动操作的 ProcessState、IPCThreadState 封装,再加上 binder 驱动内部的结构体、命令处理,整体贯穿 Java、Native 层,涉及用户态、内核态,往上可以说到 Service、AIDL 等,往下可以说到 mmap、binder 驱动设备,是相当庞大、繁琐的一个机制。

二、应用层

1.Linux下的进程通信

  • 管道通信:1v1,两次拷贝

  • socket:效率低,开销大

  • 共享内存:性能高,安全性低

2.binder通信

binder通信:牺牲了开发灵活度,必须实现一个service,自己实现数据分发(通信的类,方法,数据,返回参数)—>aidl帮我们做

  • aidl.exe解析aidl配置类,生成一个java类

  • 写完AIDL文件之后,系统会在Build时生成一个继承IInterface接口的java文件。这个文件名和对应的AIDL文件名相同。在这个文件中,有一个内部类Stub,这个类就是Binder,所以可以认为AIDL是为了帮助系统生成对应的Binder文件。

  • 这个类继承了IInterface接口,同时这个类也是一个接口。这个接口申明了两个方法,也就是.aidl中的方法。然后声明了一个内部类Stub。这个Stub就是一个Binder类。在Stub内部还有个代理类Proxy,在跨进程通讯中,它会是客户端的代理方法。

proxy调用者,stub接收者

3.stub

  • 除去构造方法以外,Stub中的方法还有asBinder()asInterface()onTransact方法。在这三个方法之外,还有上文提到过的,两个静态ID,用来标识客户端调用的方法。

  • 其中asBinder()方法相当于一个get方法,用来返回当前的Binder对象

  • 接下来我们看一下onTransact()方法,这个方法运行在服务端,会通过code来分发具体要执行的方法(避免方法乱套)

  • asInterface()方法:判断当前服务端和客户端是否处于同一进程中。如果处于同一个进程中,会返回同一个Stub对象本身,如果处于不同的进程会返回封装后的客户端代理类Stub.proxy。这个方法会在客户端调用,用来获取对象。

4.流程总结

客户端—>proxy中请求函数—>通过remote写入(code,data,返回值,类)—>mRemote—>transact(JNI层实现)写入到系统中—> 通知服务端进程—>onTransact通过code—>调用服务端request—>结果—>写入客户端进程

三、native层

进程间通信本质:内存拷贝

  • 用户空间:存放程序的代码和数据

    内核空间:存放内核代码数据

    应用程序需接口申请才能调用代码在内核空间中运行,好处:应用程序崩溃不会导致内核崩溃

    计算机蓝屏主要是硬件驱动(在内核空间)不兼容导致

  • 物理内存

    虚拟内存:用户空间和内核空间都属于虚拟内存

  • MMU内存管理单元:cpu想要访问一个地址,通过MMU(PTE表)去取

    CPU在执行指令与数据时,获得的是虚拟内存的地址,但是CPU只能去物理内存寻址。此时,MMU就派上用场了。MMU负责,将虚拟地址,翻译成,真正运行时的物理地址。

1.Binder基于mmap如何实现一次拷贝

(binder驱动)内核空间和(接收方进程)用户空间映射到同一块物理内存上
发送方进程copy_from_user—>Binder驱动(内核空间)<—>mmap映射物理页alloc_page,接收方进程<—>mmap映射物理页alloc_page

  • 内核刚开始只是分配了一个物理页,并且分别将这个物理页映射到进程的内核虚拟地址空间V1(修改内核空间的页表映射)和进程的用户虚拟地址空间V2(修改用户空间的页表映射)。在用户空间访问V1和在内核空间访问V2,其实都是访问的是同一个物理内存块,从而实现进程的内核和用户空间共享同一块物理内存的目的。这样binder驱动在内核空间,将一段数据拷贝到这个物理页,则该进程的用户空间则不需要copy_to_user()即可以同步看到内核空间的修改,并能够访问这段物理内存

2.Intent传参大小限制

4M,mmap映射时会判断大小

初始化binder—>binder_open(路径)—>mmap映射—> binder_loop不断解析分发物理内存中数据

四、驱动层

service manager(单独进程):运行binder,实现android进程间通信,父进程是init进程

  • init—>service manager

  • init—>zygote—>systemServer

copy_from_user:用户空间拷贝到内核空间(驱动)

Binder驱动核心是维护一个binder_proc类型的双向链表,里面记录了servicemanager在内的所有service信息,当client去请求某个service时,binder驱动去binder_proc中查找相应的service返回给client,同时增加service的引用个数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Binder机制详解(三) 的相关文章

随机推荐

  • EasyUI之Combobox(下拉列表框)组件

  • 淘宝商品图文描述

    data sellerId 2209194664312 wdescContent pages https img alicdn com imgextra i1 2209194664312 O1CN01rhwtQh1hiwZNnUNh3 22
  • QT 之多种布局展示

    QT布局 目录 QT布局 一 QHBoxLayout QVBoxLayout 二 QFont 大小 颜色 三 QLinearGradient 颜色渐变 应用背景渐变 四 QGroupBox分组框 五 QSS 结合setStyleSheet使
  • 03libevent下通信的主要函数

    03libevent下通信的主要函数 以下是关于libevent学习的相关文章 01libevent库的下载与安装并且测试是否安装成功 02libevent库的整体框架思想 03libevent下通信的主要函数 04libevent库下fi
  • JDK环境

    windows 1 下载jdk 2 安装 3 找到具体位置 4 添加jre 新版本不用天健jre 调换盘符 D 找到路径 cd 路径 输出当前路径 chdir 没安装在C盘 调盘符 准备安装jre E 换路径 cd E Program Fi
  • 微博评论爬虫解决 meiko 之问,S 11 冠军皮肤选猫咪还是选露露呢

    S11 结束了 EDG 牛逼就完事了 作为 Meiko 十年老粉 我看到他发了这样一条微博 所以是选露露还是猫咪呢 广大网友在评论区讨论得不亦乐乎 我突然灵光一闪 可以用爬虫把这些评论抓取下来 提取每一条评论中的包含露露 猫咪等关键词 每一
  • 【Nginx】检查配置文件是否正确

    1 进入配置nginx路径 usr local sbin nginx t c usr local nginx conf nginx conf 2 返回这个就是正确 nginx the configuration file usr local
  • (要更新)N沟道和P沟道MOSFET

    一 借鉴基础知识 MOS管基础知识百度文库链接 https wenku baidu com view fc0a7d2eccbff121dd3683b2 html 首先 我并没有转载某知名博主的文章 只是觉得PPT的图片截取的还可以 其次 博
  • 抖音引流话术怎么写?这些引流话术你必须掌握

    抖音引流话术怎么写 这些引流话术你必须掌握 在这个以流量为红利的互联网时代 越来越多的人抓住这个营销风口利用抖音平台来吸引流量赚钱 那么我们应该如何在抖音上正确的话术引流而不被限流封号呢 被降权限流后又该怎样快速恢复播放量 相信现在玩一抖双
  • < 纯前端实现「羊了个羊」小游戏 >

    纯前端实现 羊了个羊 小游戏 背景 游戏本体 原理讲解 gt 地图模拟 gt 地图生成 gt 覆盖关系 gt 填充数据 gt 点击交互 往期内容 背景 最近简单的 羊了个羊 小游戏火到出圈 据说狂赚几百几千万 这么弱智的玩意 即便是前端 我
  • 使用make_blob,KNeighborsClassifier-K近邻算法进行分类

    写这篇博客源于博友的提问 1 效果图 输入 100 5 3 7 得到结果 2 可视化效果图如下 待预测点红色x展示 输入 88 2 1 9 得到结果 1 可视化效果图如下 待预测点红色x展示 2 源码 KNeighborsClassifie
  • [电源系列]二、低成本MOS快速关断电路原理分析

    电源系列 二 低成本MOS快速关断电路原理分析 1 电路图 2 电路分析 1 电路图 如图所示 R22为PWM输入 16 8V为输入电压 4为输出开关管 Q5 D2 R17为MOS快速关断电路 2 电路分析 当PWM输入为高时 三极管Q6导
  • [LitCTF 2023]Http pro max plus

    打开环境后提示说 只允许在本地访问 本地访问 还是想到了XFF字段 好家伙的 直接被嘲讽 还是了解太少了 都不知道还有没有其他方式可以控制ip地址信息 经过查看wp 得知一种新的方式 Client IP 当客户端发送HTTP请求时 可以使用
  • java学生信息管理系统实训报告错误总结

    1 知道了Java数据库应用怎样连接 还有关于mysql数据库 在写代码之前 我们要先在lib里面添加连接MySQL数据库的jar包 作为库添加到项目里 Add as Library 然后在创建实体类的时候 名称要和mysql数据库里面的名
  • element的el-select input组件双向绑定无法选中回显的问题

    在选择下拉后出现了下拉无法回显的情况 但是其他输入框一填内容 马上就回显了的情况 经过排查也并不是下拉框绑定的值有问题 最后是使用了Vue 官方提供了 vm forceUpdate 方法才解决的 此方法的作用是迫使 Vue 实例重新渲染 解
  • FasterViT实战:使用FasterViT实现图像分类任务(二)

    文章目录 训练部分 导入项目使用的库 设置随机因子 设置全局参数 图像预处理与增强 读取数据 设置Loss 设置模型 设置优化器和学习率调整算法 设置混合精度 DP多卡 EMA 定义训练和验证函数 训练函数 验证函数 调用训练和验证方法 运
  • IPv6笔记-地址结构与分类

    1 地址基础 IPv6地址由被划分为8个16位块的128位组成 然后将每个块转换为由冒号符号分隔的4位十六进制数字 2001 0000 3238 00E1 0063 0000 0000 FEFB 每一块多个前导的0可以省略 一个块全为0可以
  • Unity_There are 2 audio listeners in the scene.Please ensure there is always exactly one audio......

    分析 这意味着你有两个音频监听器 每个摄像机可能有一个 您一次只能有一个音频侦听器处于活动状态 您必须在相机之间切换时启用 禁用它们 或者删除其中一个 解决方案 您可以通过在heirarchy视图上方的搜索字段中键入AudioListene
  • 【C++】类的小练习

    目录 基本知识 例题1 正方体 完整代码 不足 例题2 点与圆 要点 完整代码 头文件point h 源文件 基本知识 class 类名 访问权限 属性 参数 行为 函数 注 类中的属性和行为统称为成员 属性 也称 成员属性 成员变量 行为
  • Binder机制详解(三)

    系列目录 Binder机制详解 一 Binder机制详解 二 文章目录 前言 一 Binder机制理解 二 应用层 1 Linux下的进程通信 2 binder通信 3 stub 4 流程总结 三 native层 1 Binder基于mma