1. 程式人生 > >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作業系統》