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

相关文章

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

MySQL8 密码强度评估与配置详解

《MySQL8密码强度评估与配置详解》MySQL8默认启用密码强度插件,实施MEDIUM策略(长度8、含数字/字母/特殊字符),支持动态调整与配置文件设置,推荐使用STRONG策略并定期更新密码以提... 目录一、mysql 8 密码强度评估机制1.核心插件:validate_password2.密码策略级

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

详解python pycharm与cmd中制表符不一样

《详解pythonpycharm与cmd中制表符不一样》本文主要介绍了pythonpycharm与cmd中制表符不一样,这个问题通常是因为PyCharm和命令行(CMD)使用的制表符(tab)的宽... 这个问题通常是因为PyCharm和命令行(CMD)使用的制表符(tab)的宽度不同导致的。在PyChar