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操作系統》
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章