本文主要是介绍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 内核。
参考
- iPhoneWiki: The iPhone Wiki.
- 《深入解析Mac OS X & iOS操作系统》
这篇关于iOS BootLoader详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!