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

相关文章

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字