【Android】Android中的系统镜像由什么组成?

在这里插入图片描述

文章目录

  • 总览
  • Boot Loader 的加锁与解锁
  • Boot 镜像
    • 内核
    • RAM disk
      • ARM 中的设备树 (Device Tree)
  • /System 和/Data 分区镜像
  • 参考

总览

各种Android设备都只能刷专门为相应型号的设备定制的镜像。

厂商会提供一套系统镜像把它作为“出厂默认”的 Android 系统刷在设备上。

一个完整的系统镜像是由以下几个文件组成的,刷机时它们会被写入各自对应的分区中。

  • Boot Loader:
    其中含有在启动阶段由应用处理器 (application processor)执行的代码。这些代码一般是用来寻找和加载 boot 镜像的,但同时也被用来进行固件升级和让系统启动到recovery模式下。大多数 Boot Loader 还会实现一个小小的USB栈(USB stack),通过它,用户在电脑上就可以控制启动和升级过程,通常是通过 fastboot。Boot Loader会被刷到“aboot”分区里去。
  • boot镜像:
    它一般是由内核和 RAM disk 组成的,作用是加载系统。假设启动正常,RAM disk 会被 Android 用作 root 文件系统,其中的/init.rc 及相关文件规定了系统余下的其他部分该如何被加载。boot 镜像会被刷到“boot”分区里去。
  • recovery镜像:
    这个镜像同样是由内核和(另一个)RAM disk 组成的,一般用来在正常启动失败或者通过 OTA 升级时,把系统加载到“recovery 模式”。这个镜像会被刷到“recovery”分区上。
  • /system 分区镜像:
    这里存放的是一个完整的 Android 系统,其中除了谷歌提供的二进制可执行文件和框架(framework) 之外,还有厂商或运营商提供的类似的东西。
  • /data 分区镜像:
    这里存放的是“默认出厂设置”的数据文件,它们是/system 分区中程序正常运行所必需的文件。当手机需要重置到“出厂状态”时,也只需把这个分区镜像刷写到/data 分区,覆盖掉原来的数据即可。

Boot Loader 的加锁与解锁

Android 设备上的 Boot Loader 一般都会被加锁。也就是说,如果数字签名验证没有通过,手机/平板电脑会拒绝刷机或用更新的镜像启动。厂商会在 ROM 中提供他们的公钥,该密钥被用来建立一条贯穿启动过程始终的信任链。这样,所有的启动组件(从rpm到 sbl再到Android Boot Loader)就都可以被验证 (是否来自厂商或有无遭到修改)了。对这些组件的逆向分析表明,其中都有一个X.509v3 的证书,以及验证密钥时所必需的 OpenSSL 相关代码。

被解锁之后(如果可能的话), Boot Loader 就能完全控制/data 分区中的信息。所以解锁 BootLoader 会从根本上危及手机的安全性,因为攻击者拿到手机之后,就能给手机刷一个能绕过用户的开机密码或者锁屏图案的恶意更新包,或者把/data 分区中的数据复制出来,把里面的所有个人信息全部偷走。

如果 BootLoader 不能解锁,那么至少从理论上说,只要不被 root,手机就是安全的。不过在实践中,Android 也并不是不存在能够 root 它的漏洞。事实上,任何一个 3.13 及以后版本的Linux内核漏洞利用代码都有可能被用来 root Android 系统。著名的“TowelRoot”(这个漏洞利用代码是由 GeoHot 公开的)会影响到目前市场上销售的所有 Android 设备,而这还只是好几个般被称为“一键 root”(相当于 iOS 中的越狱程序)的漏洞利用程序中的一个。

Boot 镜像

Android 的 Boot 镜像中存储的是操作系统的核心组件,包括内核和 RAM disk。此外,Boot镜像(它是由Android 源码树中的 mkbootimg 创建的)的组成部分还有一个很小的头部、内核命令行、一个 Hash以及一个可选的(在实践中并不使用的)二级启动加载器。

所有这些组件都是闪存页边界(通常为2KB)对齐的。Boot 镜像可以用它的文件签名“ANDROID!”予以识别,这和上文中我们可以用Boot Loader 的文件签名“BOOTLDR!”识别 Boot Loader 的原理是一样的。

内核

与大多数操作系统的内核不同,Linux 的内核大多是经过压缩的。内核镜像文件格式(也被称为 zImage 格式)规定,其中必须含有用来把内核镜像中其他经过压缩的部分解压到内存中去的自解压代码。由于不同压缩算法各有所长,所以可选的压缩算法也有好几个,具体使用哪种算法是在 build 内核的过程时 (make config)决定的,如图:
在这里插入图片描述
内核总是会先运行自解压代码,这也就意味着,我们得先搜索一下文件,找到压缩算法的签名。传统上,大多数ARM 内核使用的都是 zmage,尽管严格意义上说并不一定要这样做。

内核是 Android 系统中与体系结构最为紧密相关的部分。尽管其他的一些组件也需要关心处理器的类型 (系统中使用的到底是 ARM、Intel 还是 MIPS 处理器),但是内核还要关心主板类型和芯片组的型号。因为事实上,移动设备的处理器是个单晶片系统(SoC,System-on-Chip,它由一组芯片构成),其中还含有其他芯片,内核也必须为这些芯片提供专用的驱动。这些驱动是源码树的一部分,谷歌为不同的芯片组提供了不同的内核设备树 (device tree)。

RAM disk

Boot或recovery 镜像的另一个组件就是“initialRAM disk”,它通常也被简称为initrd。RAMdisk 提供了最初的文件系统,在操作系统启动时,它被用作根文件系统(/)。它会和内核一起被 BootLoader 预加载到 RAM (也就是内存,所以得名 RAM disk)中去,所以是可以直接访问而不需要经过任何特殊的驱动的。

这并不是一个 Linux 特性,我们知道,在其他一些 UNIX 系统中也使用它,其中最著名的当属iOS 了,尽管 iOS 中是把它和
kernel cache 并排放在ipsw 系统镜像里的。

传统上,initramfs 是用来提供内核操作时所需的相关设备的驱动程序的。在它的帮助下,Linux 发行版本才能提供一个通用的、相对紧凑的内核,并在最开始安装的过程中,把所需的驱动打包放进一个单独的文件中。

为了解开“先有鸡还是先有蛋”,即加载驱动先要能访问存储器,而要能访问存储器又先要有存储器的驱动这个死结,一些关键的必备驱动会被打包放在 intramfs 中。这样,内核就能直接在 RAM中访问到它们了。initramfs 中还含有一个启动程序/init,内核会把它作为系统中的第一个进程(PID=1)运行起来,用于完成一些需要在用户模式 (user mode) 下执行的初始启动操作,比如加载模块。

当RAM disk 的操作完成之后,Linux 通常都会丢弃掉它,以便使用磁盘上的文件系统,用一个通常被称为“pivoting root”的进程。

但在Android 中,initramfs 却还是会被保留在内存中用来提供根文件系统(/)。由于其中的文件会被经常访问,而且 RAM disk 本身所占的内存空间也非常的小,所以这样做还是很有用的。此外,这么做也使得修改根文件系统的难度变得更大了一些,因为 Boot 镜像是有数字签名保护的。

Linux支持两种文件格式的RAM disk–initrd (ext4文件系统镜像)和initramfs (CPIO文件)。后者更为常用,不过常常也会被称为 imitrd。CPIO 文档是一种只需占用很少内存空间的简单格式。为了进一步节省空间,该文档还会经过 gzip 压缩(内核是支持 zlib 的,因为内核要用它把自己解压出来)。

根据相关规定,内核在被压缩之后会和 RAM disk 一起放在一个单独的分区中。这背后有一个非常重要的设计思想,就是把两个东西打包在一起,只要用一个数字签名,就能同时保护这两个东西。

即,只要应用一次防篡改措施,就能保护两者都不会被篡改。内核当然是系统的关键组件,但 RAM disk 也是非常重要的,其中的/init 及其对应的/init.rc 文件控制着系统的启动过程。/init 会以 root 权限启动,负责启动所有其他的系统组件,只要修改一下/init.rc 文件就能获取设备的 root 访问权限,但只要搞不定数字签名,这一切就是水中花,井中月。

ARM 中的设备树 (Device Tree)

大多数ARM内核需要靠设备树 (device tree)文件向内核提供硬件设备定义的相关信息这个文件提供了设备相互连接的层次关系,使得内核能够据此启动相应的设备。

设备树文件一般会被附加在内核镜像的尾部,但有时也会为它专门分配一个分区。

设备树是一个二进制的 blob 文件,可以通过它的文件签名 0xd0dfeed 予以识别。

“Blob” 一词通常用来指代二进制大型对象(Binary Large Object),是一种存储二进制数据的数据类型。在计算机领域中,“blob” 可以表示任意类型的二进制数据,如图像、音频、视频等。这个术语通常用于描述数据库中存储的非结构化数据。
另外,在编程和计算机科学中,“blob” 也可能指代内存中的一块连续的二进制数据块,通常用来存储临时数据或需要以原始形式处理的数据。

/System 和/Data 分区镜像

因为厂商可以提供自己专门开发的分区刷写工具,所以,用哪种镜像文件格式存储它们完全可以由厂商自己说了算。不过由于大多数厂商使用的还都是 fastboot,所以他们很可能也就沿用了谷歌在自己的镜像上使用的 simg(sparseimage)格式。能处理这种文件格式的实用程序可以在AOSP的system/core/libsparse目录下找到。

参考

《最强Android书:架构大剖析》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中国城市二氧化碳排放数据,农业服务业工业等行业排放量均有~有shp和excel格式

基本信息. 数据名称: 中国城市二氧化碳排放数据 数据格式: Shpexcel 数据几何类型: 面 数据坐标系: WGS84 数据来源:网络公开数据 数据字段: 序号字段名称字段说明1ny农业排放量(万吨)2fwy服务业排放量(万吨…

无刷电机学习-方波电调 电路篇

想要彻底的理解无刷电机的驱动,那必然少不了学习他的驱动电路和程序。这里用开源的AM32无刷电调(方波驱动)来作为学习无刷电机笔记。 https://github.com/AlkaMotors附上作者github地址 AM32_Hardware: 基于AT32MCU的AM32PCB另一位大佬开源…

【python文件】生成的csv文件没两行数据之间有一个空行

问题描述 用python代码将数据写入csv文件,但生成的csv文件没两行数据之间有一个空行,如下图所示: 解决办法 在open函数中添加newline,如以下代码所示,即可解决这一问题。 with open(r"C:\Users\xxx\Desktop\DR…

Java实现桃花峪滑雪场租赁系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 游客服务2.2 雪场管理 三、数据库设计3.1 教练表3.2 教练聘请表3.3 押金规则表3.4 器材表3.5 滑雪场表3.7 售票表3.8 器材损坏表 四、系统展示五、核心代码5.1 查询教练5.2 教练聘请5.3 查询滑雪场5.4 滑雪场预定5.5 新…

Universal Approximation Capabilities of Mixture of Weibulls (混合韦布尔分布的万能近似)

找了好久都没有找到混合韦布尔分布是否有万能近似性质,下面这个算是一点线索,不过看不太懂。 回答1:Ultimately this sounds tautological: just define “well-behaved” as any density that can be approximated, according to some speci…

企业计算机服务器中了360后缀勒索病毒怎么办,360勒索病毒解密流程

计算机网络技术的不断应用,极大地提升了企业办公与生产效率,为企业提供了极大方便,但同时也为企业的数据安全埋下隐患,近期云天数据恢复中心再次接到企业的求助,企业的计算机服务器遭到了360后缀勒索病毒攻击&#xff…

Axure校园跑步社交APP原型图,大学生运动健身原型模板53页

作品概况 页面数量:共 50 页 兼容软件:仅支持Axure RP 9/10,非程序软件无源代码 应用领域:运动健身、校园app、社交应用 作品特色 本作品为校园跑社交app原型图,高保真带交互,是一款专注于校园健身社交的…

基于Python Django的大数据招聘数据分析系统,包括数据大屏和后台管理

基于Python Django的大数据招聘数据分析系统是一个综合利用大数据技术和数据可视化技术的招聘行业解决方案。该系统旨在帮助企业和招聘机构更好地理解和分析招聘市场的趋势和变化,从而提高招聘效率和质量。 首先,该系统提供了一个强大的后台管理功能&am…

SSL证书是什么,有哪些作用

SSL证书是什么? SSL证书 是一种提供SSL协议的证书,通过在客户端浏览器与WEB服务器之间建立一条SSL安全通道,对网络传输数据进行加密,防止数据被截取或窃听。一份SSL证书包括一个公共密钥和一个私用密钥:公共密钥主要用…

【Python】如何在服务器上优雅的部署Python项目(Linux/Windows/Mac)

一.venv独立运行环境(虚拟环境) 一般每个不同的项目都会依赖各自的库,有些库的版本不一样会引起冲突,为了解决这个问题,需要使用虚拟环境,Python可以在每个项目目录下创建各自的虚拟环境,项目所依赖的包就在当前目录环…

【idea插件开发】idea插件访问浏览器web地址

背景 以往在eclipse上面开发插件,有兴致想尝试Idea上玩一下插件开发。想要在idea上面访问web地址 概要 记录在idea上面访问web地址 正文 1、点击File->New->Project… 选择IntelliJ Platform Plugin 2、点击下一步后,输入Project Name&#…

jenkins安装配置,使用Docker发布maven项目全过程记录(1)

使用的CentOS8 系统,其它Linux系统类似 1、jenkins安装 1.1、配置JAVA环境 使用的服务器环境中,安装了Java1.8与Java17,当前jenkins的最低java版本要求java11。系统默认使用的是java1.8,因此需要切换环境。 alternatives --co…

认识与探索大模型时代的RPA应用及进化(上)

AI Agent当前仍然处于技术爬坡与实验阶段,特别是在企业领域,真正的成熟应用还处于广泛探索与原型验证阶段,离成熟还尚待时日。而同时另外一种在最近几年广受欢迎的自动化解决方案-RPA(机器人流程自动化)也在LLM时代不断…

哪些方法能将静图变动图?这一个网站帮你解决

怎么将静态图片变成gif动图?我们经常能看到各种网络平台都能看到各种把静图制作成gif动图的软件,觉得非常的有意思。但是这种软件大部分都是需要下载或者操作起来很麻烦。那么,有没有什么简单容易操作的在线图片合成(https://www.…

Java调用C++的DLL设计!!!解耦实用!!!

问题背景:Java调用C,通常推荐用JNI(Java Native Interface)http://t.csdnimg.cn/kjOND 但是调用时每调用一个C方法都需要在Java程序中增加,不符合设计时的开放封闭原则,业务一边程序就要修改 public clas…

基于springboot+vue的社区医院信息平台系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

计算机毕业设计 | SpringBoot+vue 社区老人健康管理系统(附源码)

1,绪论 对于目前的中国来讲,人口老龄化日益严重,目前最新统计数据表明,60岁以上老人所占的人口比例已达到接近20%。这给我们国家带来了严重的养老压力,同时也严重削弱了我们人力大国的人力优势。对于这些老年人来讲&a…

Github 不能访问,提示:port 22: Connection timed out

问题描述 github clone 代码出现错误: $ git clone gitgithub.com:Atlan4/Fnirsi1013D.git Cloning into Fnirsi1013D... ssh: connect to host github.com port 22: Connection timed out fatal: Could not read from remote repository.Please make sure you ha…

2024最新防泄密软件推荐,防泄密软件有哪些功能

今天公司发生一件大事: 竟然会发生泄密事件!!! 针对这种事情,作为企业管理者,需要提高警惕,不但要解决好已经发生的事,平时也要做好预防工作。 如何做好企业防泄密工作?…

Spring Security 之 表单登录

表单登录 Spring Security提供了支持通过HTML表单提供用户名和密码。本节详细介绍了Spring Security中表单身份验证的工作原理。 本节将介绍Spring Security中的基于表单的登录工作原理。首先,我们将看到用户如何被重定向到登录表单。 第1步,用户首先对其未经授权的资源(/…