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

Android 进阶——Framework 核心之Binder 相关预备理论(一)

文章大纲

  • 引言
  • 一、进程的内存空间和进程隔离
  • 二、Linux 系统内存的用户空间和内核空间
    • 1、用户空间(User Space)
    • 2、内核空间(Kernel Space)
  • 三、Linux IPC 原理
    • 1、内核态和用户态
    • 2、IPC 步骤
  • 四、内核模块和驱动
  • 五、Binder
    • 1、Binder IPC概述
    • 2、Binder的优势
      • 2.1、Binder 传输性能高
      • 2.2、Binder 安全性好
    • 3、Binder 使用简单

引言

Android OS=Android Runtime+Linux Kernel。在Android系统中每一个应用程序都运行在独立的进程中(确保了某个进程异常而不会影响另一个进程的运行),自然就少不了进程间通信IPC(Internet Process Connection)。那么Android为啥没有采用Linux那么多的像管道(Pipe)、信号(Signal)和跟踪(Trace)、插口(Socket)、报文队列(Message)、共享内存(Share Memory)和信号量(Semaphore)等传统IPC手段,而是自己设计开发一套独特的IPC 手段——Binder IPC呢,接下来系列文章,我们将全面揭开其神秘面纱,第一篇先对Binder 有关的Linux常识进行小结,学习完之后,你会知道为什么要Binder?

本系列文章中,Service指的是提供服务的代码,这些代码最终体现为一个个的接口方法,换言之,Service就是实现一组方法的对象,通常也称为Service组件(为了防止混淆,我用了不严谨的Server组件替代)并非Android 中的四大组件的概念,另外UML类图可能不太严谨,针对源码部分更多的是解读其功能而所有具体的实现代码,仅供参考。

一、进程的内存空间和进程隔离

进程是一个可执行文件的执行体,除了包含指令之外,还有包含了大量的资源,各自拥有独立的虚拟地址空间,即进程空间。在Linux中通过虚拟内存机制为每个进程分配了线性连续的内存空间,再将这虚拟内存空间映射到物理内存空间。这是出于安全的考虑,每个进程的虚拟内存空间都是相对独立的,每个进程只能操作自己的虚拟内存空间,只有操作系统才有权限操作物理内存空间,即所谓的进程隔离,进程隔离保证了每个进程的内存安全。简而言之,为了确保进程安全,Linux通过虚拟内存机制实现了进程隔离。

二、Linux 系统内存的用户空间和内核空间

但是进程之间不可能是一个与世隔离的桃花源,也需要互相通信,于是对内存的操作既要确保安全又要互相通信,
在这里插入图片描述
于是如上图所示, Linux操作系统在逻辑上将虚拟内存分为用户空间(User Space)内核空间(Kernel Space), 以32位操作系统为例,内核空间大小为3GB(是一整块的),用户空间大小为1GB (许多独立的小块)。

1、用户空间(User Space)

可以理解为有很多小块用户空间,通常每一个进程一个独立的用户空间,所有的进程都是存储在用户空间上的,只有同一个进程的用户空间才可以互相访问且用户空间是不能反射到内核空间 ,其中不同进程之间的用户空间互相独立,用户空间和内核空间通过系统调用(即内核提供的api )进行通信,但共享内核空间,而我们的应用程序是存储在一个独立的用户空间部分的内存中的,表示进程运行在一个特定的操作模式中,没有接触物理内存或设备的权限

2、内核空间(Kernel Space)

Linux 系统中内核空间占绝大部分,而是可以理解为是一整块且不同进程之间共享内核空间,表示独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。

三、Linux IPC 原理

Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection): 管道(Pipe)、信号(Signal)和跟踪(Trace)、插口(Socket)、报文队列(Message)、共享内存(Share Memory)和信号量(Semaphore)。

在这里插入图片描述

  • 只有允许不同应用的客户端用 IPC 方式调用远程方法,并且想要在服务中处理多线程时,才有必要使用 AIDL
  • 如果需要调用远程方法,但不需要处理并发 IPC,就应该通过实现一个 Binder 创建接口
  • 如果您想执行 IPC,但只是传递数据,不涉及方法调用,也不需要高并发,就使用 Messenger 来实现接口
  • 如果需要处理一对多的进程间数据共享(主要是数据的 CRUD),就使用 ContentProvider
  • 如果要实现一对多的并发实时通信,就使用 Socket

1、内核态和用户态

普通应用程序运行在用户空间,系统内核运行在内核空间,为了控制应用程序的访问范围、保证系统安全,用户空间只能通过系统调用的方式去访问内核空间。当进程执行系统调用而陷入内核代码的时候,即该进程陷入了内核态,而进程在用户空间执行自己的代码的时候,则是处于用户态。 Linux提供了系统调用作为切换用户态与内核态的机制。其底层是通过中断机制来实现的。简单的说,当用户态执行到需要内核态执行的代码时,会产生一个中断信号,cpu收到信号后会根据中断信号传递的信息进入不同的中断函数,当中断函数执行完毕后,就会回到用户态。

2、IPC 步骤

由于进程 A 和进程 B 的虚拟地址不同,因此它们之间是相互透明的,都以为自己独享了系统的资源,当然也不能直接跟对方交互。但是有些情况下有些进程难免会需要跟其他进程进行交互,这个交互过程就叫 IPC(Inter-Process Communication,进程间通信)。IPC 的实质就是数据的交互,因此我们这里将进行 IPC 过程中的通信调用方和被调用方分别称为数据发送方和数据接收方,则IPC 通信的过程如下:

IPC 通信步骤
1、数据发送方将数据放在内存缓存区,通过系统调用陷入内核态
2、内核程序在内核空间开辟一块内核缓存区,通过 copy_from_user 函数将数据从数据发送方用户空间的内存缓存区拷贝到内核空间的内核缓存区中
3、数据接收方进程在自己的用户空间开辟一块内存缓存区
4、内核程序将内核缓存区中通过 copy_to_user 函数将数据拷贝到数据接收方进程的内存缓存区

因此进程通信的原理就是通过内核空间进行间接通信,简单来说就是进程A通过系统调用访问内核空间,并在内核空间操作一些数据,再由内核空间告知给进程B要操作的数据。

操作系统中安全边界的概念就像环路的概念一样(前提是系统支持这种特性),一个环上持有一个特定的权限组,Intel 支持四层环,但是 Linux 只使用了其中的两环(0号环持有全部权限,3号环持有最少权限,1号和2号环未使用),系统进程运行在1号环,用户进程运行在3号环,如果一个用户进程需要其他高级权限,其必须从3号环过渡成0号环,过渡需要通过一个安全参数检查的网关,这种过渡被称为系统调用,在执行过程中会产生一定数量的计算开销。所以,用户空间要访问内核空间的唯一方式就是系统调用(System Call)

四、内核模块和驱动

在Linux中通过系统调用,用户空间程序就可以访问内核空间,本质上就是借助内核模块去完成的(因为内核空间是共享的)。Linux提供动态可加载内核模块机制(模块是具有独立功能的程序,它可以被单独编译,但不能独立运行)。即通过添加一个内核模块运行在内核空间,用户进程的以该模块作为桥梁完成互相通信了。而在Android系统中这个运行在内核空间的负责各用户进程Binder通信的内核模块叫做Binder驱动

五、Binder

1、Binder IPC概述

从模型上来说Binder IPC基于C/S架构,提供服务的进程作为Server端,而请求服务的作为Client端,两者都运行在各自的用户空间上,只能通过运行于内核空间的Binder 驱动进行通信,而为了便于管理和使用服务Android采用了Service Manager进程统一管理所有的Binder服务。所谓通信本质上就是I/O,Linux 一切皆文件,于是Binder驱动通过虚拟出的设备文件/dev/binder连接Server进程、Client进程和Service Manager进程,通过/dev/binder的句柄即可以进行I/O,每一个句柄最大支持16个线程,又由于Binder 需要一条管理自身的进程,因此最多支持15条工作线程并发。

2、Binder的优势

2.1、Binder 传输性能高

得益于内存映射技术,在初始化Binder设备时即把自己的内存映射到Binder驱动层(内核空间),只需要复制一次即可完成数据传输(通过驱动在内核空间拷贝数据,不需要额外的同步处理),而Binder数据拷贝只需要一次,而管道、消息队列、Socket都需要2次。当用户进程打开Binder设备后会调用mmap函数在驱动中创建一块内存空间用于接收传给本进程的Binder数据。当发生Binder调用时,数据会从数据发送方复制到内核空间中,驱动会在接收进程的缓冲区中寻找一块合适大小的空间来存放数据,因为mmap使得接收进程的用户空间的缓冲区和内核空间的缓冲区是共享的,这样接收进程就不需要将数据从内核复制到自己的用户空间了。

2.2、Binder 安全性好

在 Binder 通信时会根据 UID/PID 进行有效性检测,支持实名binder和匿名binder(匿名Service存储的地方根据具体实现而定,如果服务端不向外告知,外部是不知道对象存在的,当服务绑定客户端成功后才可以通过对象把服务传给远程的客户端)。

3、Binder 使用简单

得益于Binder 优秀的架构设计可以像使用普通对象一样以面向对象的方式调用远程服务对象。在这里插入图片描述
未完待续…

相关文章:

Android 进阶——Framework 核心之Binder 相关预备理论(一)

文章大纲引言一、进程的内存空间和进程隔离二、Linux 系统内存的用户空间和内核空间1、用户空间(User Space)2、内核空间(Kernel Space)三、Linux IPC 原理1、内核态和用户态2、IPC 步骤四、内核模块和驱动五、Binder1、Binder IP…...

【23种设计模式】结构型模式详细介绍

前言 本文为 【23种设计模式】结构型模式 相关内容介绍,下边将对适配器模式,桥接模式,组合模式,装饰模式,外观模式,亨元模式,代理模式,具体包括它们的特点与实现等进行详尽介绍~ &a…...

接口自动化实战-postman

1.测试模型 单元测试并非测试工程师的本职工作,它属于开发工程师的工作,开发进行单元测试的情况我们不知道,为了确保系统尽可能没有Bug,于是接口测试在测试工程师这里就变得由为重要了。实际工作中为菱形模型。 接口测试能更早的…...

前端跨域方案简单总结

1、什么是跨域 【】跨域是一种浏览器同源安全策略,也即浏览器单方面限制脚本的跨域访问。很多人可能误认为资源跨域时无法请求,实质上请求是可以正常发起的(指通常情况下,部分浏览器存在部分特例),后端也可…...

【HTML】HTML 表格 ② ( 表头单元格标签 | 表格标题标签 )

文章目录一、表头单元格标签二、表格标题标签一、表头单元格标签 表头单元格 可以在表格中 用作第一排 作为表格 的 表头 使用 , 表头单元格 中的 文本设置 可以与 普通单元格 中的文本设置 不同 ; 表头单元格 中的 文本 会 居中 , 并且 加粗 显示 ; 表头单元格 标签 如下 : &…...

常用的辅助类2(StringBuilder、StringBuffer、处理时间相关的类、对象比较器)

Java知识点总结:想看的可以从这里进入 目录7.7、字符串相关类7.8、时间处理7.8.1、JDK8前7.8.2、JDK8后1、时间日期类2、格式化日期3、其他7.9、对象比较器7.7、字符串相关类 String:JDK1.0出现,字符串类,被final修饰其值不可改。…...

anaconda下pytorchCPU GUP安装及问题记录

1 pytorch安装(CPU版本) pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple2 torchvision、torchaudio、torchtext安装:解决ModuleNotFoundError: No module named ‘torchvision‘问题 &#xff08…...

香港中文大学MISC Lab GNN团队: 异质图神经网络研究进展从谱的角度看待(图)对比学习(图自监督学习)

简介 实验室简介 香港中文大学机器智能与社会计算实验室(MISC Lab, Machine Intelligence and Social Computing Lab) 由Prof. Irwin King 创建并不断发展, 在图学习,推荐系统,自然语言处理,机器学习等领域取得了卓越的研究成果。在图学习方面, MISC Lab关注异质图学习(Het…...

C#开发的OpenRA的Enumerable.Concat方法应用

C#开发的OpenRA的Enumerable.Concat方法应用 在OpenRA游戏里,可以让用户指定搜索目录,也可以搜索应用程序所在的目录。 还需要把这两个结果集连接到一起,那么它是怎么实现的呢? 它是采用了Enumerable.Concat方法,实现两个列表的结果集进行合并。 可以看一下这个函数的代码…...

前端知识点总结(自参)

BFC 块级格式化上下文。BFC元素不会影响到其它环境中的布局。 触发BFC的条件 根元素或其它包含它的元素浮动元素 (元素的 float 不是 none)绝对定位元素 (元素具有 position 为 absolute 或 fixed)内联块 (元素具有 display: inline-block)表格单元格 (元素具有 display: tabl…...

[ 靶场环境片 ] kali-linux采用Docker 搭建 pikachu(特别详细)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末…...

阿里6面,成功唬住面试官拿了27K,软件测试面试也没有传说中那么难吧....

阿里的面试挺独特,每轮面试都没有 HR 约时间,一般是晚上 8 点左右面试官来一个电话,问是否能面试,能的话开始面,不能就约一个其它时间。 全程 6 面,前五面技术面,电话面试,最后一面…...

为什么静默安装未经过数字签名的驱动是不可行的?

我想,在 Windows XP 系统上,造成蓝屏的最主要原因是带有 Bug 的设备驱动程序。 请问在座的,谁赞成,谁反对。 因为驱动运行在内核模式,再也没有更高级别的组件对其进行行为监管,它可以做它想做的任何事情。…...

Caused by: java.sql.SQLException: ORA-28040: 没有匹配的验证协议

更改Oracle的配置文件:Oracle -> app -> ... ->...dbhome... -> admin重启Oracle:重启Oracle数据库的操作步骤1.查看监听器状态:lsnrctl status2.停止监听器:lsnrctl stop3.连接数据库:sqlplus / as sysdba4.停止数据…...

Dubbo3简单使用

Dubbo3简单使用 👉 使用Spring Boot实现Dubbo3,请参见以下地址。 # Dubbo3官网地址 https://cn.dubbo.apache.org/zh/# 使用SpringBoot实现Dubbo3的地址 https://cn.dubbo.apache.org/zh/docs3-v2/java-sdk/quick-start/spring-boot/# 该项目的git地址…...

Redis未授权漏洞蜜罐模拟与捕获分析

1.概述 文章主要分析Redis未授权漏洞的原理及形成原因,使用vulhub靶场进行漏洞复现,在了解漏洞原理并复现的基础上使用golang编写蜜罐代码进行模拟,开放端口在网上捕获真实存在的恶意攻击行为,对恶意样本进行分析,总结…...

Spring Security Oauth2.0认证授权

基本概念认证: 用户认证就是判断一个用户的身份是否合法的过程 ,用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户名密码登录,二维码登录,手机…...

安卓小游戏:贪吃蛇

安卓小游戏:贪吃蛇 前言 这个是通过自定义View实现小游戏的第二篇,实际上第一篇做起来麻烦点,后面的基本就是照葫芦画瓢了,只要设计下游戏逻辑就行了,技术上不难,想法比较重要。 需求 贪吃蛇&#xff0…...

CUDA中的图内存节点

CUDA中的图内存节点 文章目录CUDA中的图内存节点1. 简介2. 支持的架构和版本3. API基础知识3.1. 图节点 APIs3.2. 流捕获3.3. 在分配图之外访问和释放图内存3.4. cudaGraphInstantiateFlagAutoFreeOnLaunch4. 优化内存复用4.1. 解决图中的重用问题4.2. 物理内存管理和共享5. 性…...

你真的看好低代码开发吗?

低代码开发前景如何,大家真的看好低代码开发吗?之前有过很多关于低代码的内容,这篇就来梳理下国内外低代码开发平台发展现状及前景。 01、国外低代码开发平台现状 2014年,研究机构Forrester Research发表的报告中提到“面向客户…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...