iOS BootLoader详解

2024-06-18 22:18
文章标签 详解 ios bootloader

本文主要是介绍iOS BootLoader详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • Pre-Introduction – EFI
  • Pre-Introduction – NVRAM
  • Pre-Introduction – Ramdisk and APFS FileSystem
  • BootLoader Introduction
  • BootLoader Process

正文

1. Pre-Introduction – EFI

EFI(Extensible Firmware Interface,可扩展固件接口),是由Intel公司发起用于替换计算机系统BIOS技术的开放标准。EFI可以看做是一个运行时环境,它规范了一组API(应用程序编程接口),基于EFI的程序可以利用这些API实现访问基本的硬件功能,EFI服务分为两类,引导服务和运行时服务,本文将介绍的BootLoader即属于引导服务。
MacOS/iOS的EFI实现并非标准的EFI,但是具备标准EFI的部分特性,由于Apple没有开放相关文档,我们可以从标准EFI的文档资料了解其中一二。

2. Pre-Introduction – NVRAM
NVRAM 是EFI中一个非常强大的功能,而且这显然是传统BIOS 没有的功能。NVRAM 变量和 shell 变量的语义是一样的,都是环境变量的功能,但是NVRAM 是在系统范围内存在的,它属于EFI运行时服务,所以操作系统和EFI本身都可以访问。
一般来说,NVRAM 变量可以分为以下几个类别:
a) 引导相关的变量:用于指定要引导的内核和根文件系统,还负责向内核传递参数,如“boot-command=fsboot”。
b) 固件内部变量:固件使用的变量,一般被操作系统忽略。
c) 临时变量:根据需要设置或清空,通常在重新引导的时候不会停留。

3. Pre-Introduction – Ramdisk and APFS FileSystem
1)Ramdisk是一个完整的文件系统(它是基于内存的文件系统),可以用来替换根文件系统,并且Flash文件系统也可以挂载到Ramdisk文件系统,可以修改或更新。在iOS恢复模式中会使用到。
2)APFS文件系统是包含标准的iOS镜像的文件系统(它是基于闪存的文件系统,ios专属文件系统),在内核引导加载完毕进入OS模式会加载APFS文件系统。

4. BootLoader Introduction
BootLoader(引导加载器/引导加载程序)。BootLoader process指的是从计算机通电的那一瞬间到CPU开始执行操作系统代码时的整个过程,在这个非常初期的阶段中,CPU执行标准的启动代码,这部分代码需要对硬件设备进行探测,寻找最有可能启动的操作系统并且根据用户定义的参数启动这个操作系统。BootLoader会在任何操作系统运行之前执行。
大部分的操作系统用的都是通用的引导加载器(BootLoader)。iOS使用的主引导加载器则是Apple自研开发的iBoot。

5. BootLoader Process

在这里插入图片描述
如图,iOS的启动引导分为三种模式,分别是正常模式引导、恢复模式引导以及固件更新模式引导。恢复模式引导在引导失败后会进入Recovery,固件更新模式在iOS系统升级降级会使用。

整个引导过程大概是这样的:
1>. 首先加载Boot ROM (只有这一步骤是未加密的,其他的步骤是都是加密的)
BootROM (引导ROM) 负责初始化设备,并加载底层引导加载器(Low Level Bootloader,LLB)。ROM属于设备的一部分,无法更新。
2>. 接着判断是否是DFU模式,是则跳到步骤4,否则跳到步骤3。
3>. 普通引导/恢复模式引导:
1)加载LLB
LLB(Low Level Bootloader, 底层引导加载器)负责定位并加载iBoot。如果查找iBoot失败,LLB将放弃加载并切换到固件更新模式(DFU)引导。LLB是iOS的一部分,不属于设备本身,它和iOS镜像中的其它文件一样,是被加密的im4p格式文件(在Bundle中可以看到”./Firmware/all_flash/LLB.d42.RELEASE.im4p”)。
2)加载iBoot
iBoot是引导过程中的主加载器,它负责定位、准备并加载kernelCache(链接好的内核)。iBoot它有一个内建的APFS驱动,可以直接访问iOS的文件系统,并支持多线程。iBoot通常会派生出两个线程,一个“main”线程,负责显示启动时的苹果logo,并根据auto-boot和boot-command环境变量的设置(正常引导模式下boot-command被设为fsboot)进行系统引导,引导过程可以根据bootdelay环境变量延迟进行;一个是“uart reader”线程,苹果可能将这个线程用于调试,其基本处于闲置状态。
3)在普通引导模式中,iBoot调用fsboot()函数挂载iOS系统分区,定位内核,准备设备树并引导系统,如果引导失败,则进入恢复模式引导。
4>. DFU模式引导:
1)加载iBSS:负责底层初始化以及iBEC的加载。
2)加载iBEC:负责通过USB升级/降级iOS的过程。
DFU模式允许从任何状态恢复所有设备。它本质上是BootROM可以接受iBSS的一种模式。DFU是SecureROM的一部分,它被烧录固化在硬件,只读而不能被移除。在iOS设备上,它生成ApNonce并识别APTickets(APTickets,确保每次发送的SHSH内容都不同),即使在DFU中,它也可以接受APTicket。
5>. SafeBoot Chain:
SafeBoot Chain(安全启动链)。iOS在启动过程每个步骤包含的组件都经 Apple 加密签名以确保其完整性,只有在验证信任链后,每个 步骤才能继续。这些组件包括引导加载程序、内核、内核扩展项和基带固件。
打开 iOS 设备后,处理器会立即执行只读内存(Boot ROM)中的代码。这些不可 更改的代码(称为硬件的信任根)是在制造芯片时设好的,为隐式受信任代码。Boot ROM 代码 包含 Apple 根 CA 公钥,该公钥用于验证底层引导加载程序 (LLB) 是否经过 Apple 签名,以决定 是否允许其加载。这是信任链中的第一步,信任链中的每个步骤都确保下一步骤获得 Apple 的签 名。当 LLB 完成其任务后,它会验证并运行下一阶段的引导加载程序 iBoot,后者又会验证并运 行 iOS 内核。

参考

  1. iPhoneWiki: The iPhone Wiki.
  2. 《深入解析Mac OS X & iOS操作系统》

这篇关于iOS BootLoader详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073207

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input