Ch1:背景與基礎內容介紹
1.1 背景
最近工作中使用 U-boot 進行核心引導啟動調整,發現編譯手冊中對Uboot映象編譯流程和之前接觸的不太一樣,在完成U-boot編譯流程後,需要單獨再進行 ATF 編譯。且 ATF 編譯過程中需要使用 U-boot.bin產物並且給出硬體配置。此工程的最終生成產物被分成了 atf.bin 和 u-boot.bin。對此我不禁產生了疑問,新增的 ATF 編譯流程是什麼?實現了什麼功能?以及BootLoader引導啟動流程有何變化?
1.2 BootLoader簡介
首先我們需要了解一下BootLoader是什麼。在嵌入式系統中,通常沒有BIOS那樣的韌體程式,因此需要實現整個系統的載入啟動任務需要BootLoader來完成,它在作業系統核心執行之前執行,可以完成初始化硬體裝置、建立記憶體空間對映、配置系統的軟硬體環境的工作,為最終呼叫作業系統核心執行準備好執行環境。不同的處理器架構有不同的BootLoader,它不僅依賴於CPU的體系結構,也依賴於嵌入式系統板級裝置配置與引數(DDR、Flash等)。
對於Bootloader可總結以下四點:
-
Bootloader是硬體啟動時執行的載入程式,是執行作業系統的前提;
-
Bootloader是在作業系統核心或使用者應用程式執行之前執行的一段程式碼;
-
在嵌入式系統中,整個系統的初始化和載入任務一般由Bootloader來完成;
-
對硬體進行相應的初始化和設定,最終為作業系統準備好環境。
需要注意的是 BootLoader 是獨立於作業系統的,一般由彙編程式碼和C程式碼組成,也根據程式碼實現不同劃分為兩個階段:
- 第一階段使用匯編程式碼實現,完成一些依賴於CPU體系結構的初始化,包括硬體裝置初始化、配置C語言執行環境(準備RAM空間,初始化棧等)、呼叫第二階段的程式碼;
- 第二階段通常使用C語言實現,可以實現較複雜的功能,主要包括初始化本階段的硬體裝置、檢查系統記憶體對映、讀取核心映象和根檔案系統到記憶體、為核心設定啟動引數、呼叫核心。
U-boot (Universal Boot Loader),是一個被廣泛使用的開源引導載入程式,由DENX開發,支援多種處理器架構,包括ARM、MIPS、PowerPC等,廣泛使用與嵌入式Linux系統的引導。此文件只做簡單介紹,核心關注ATF部分。
1.3 縮寫對照
縮寫 | 全稱 | 意思 |
---|---|---|
TEE | Trusted Execution Environment | 可信執行環境 |
SMC | Secure Monitor Call | 安全監視器呼叫 |
REE | Rich Execution Environment | (非可信)富執行環境 |
CA | Client Application | 富執行環境下應用程式 |
TA | Trusted Application | 可信執行環境下應用程式 |
SMCCC | SMC Calling Convention | SMC呼叫約定 |
EL | Exception Level | 異常等級 |
SCTLR | system control registers | 系統控制暫存器 |
SPSR | saved programstatus register | 程式狀態儲存暫存器 |
CPSR | current program status register | 當前程式狀態暫存器 |
Ch2:ATF介紹
TF(Trusted Firmware)是ARM在Armv8引入的安全解決方案,它的核心功能為對啟動和執行過程進行特權級劃分,為安全提供了整體解決方案。相較於Armv7中的Trust Zone(TZ)進行了提高,它包括啟動和執行過程中的特權級劃分,實現了啟動過程信任鏈的傳導,細化了執行過程的特權級區間。TF實際有兩種Profile,對ARM Profile A的CPU應用TF-A,對ARM Profile M的CPU應用TF-M。我們一般接觸的都是TF-A,又因為這個概念是ARM提出的,有時候也縮寫做ATF(ARM Trusted Firmware)。
2.1 安全引導(安全啟動)
安全引導(Secure Boot)功能是指在系統的整個啟動過程中,使用鏈式驗證電子簽名的方式來驗證系統中重要映象檔案的可靠性,然後再載入映象檔案的引導過程。安全引導功能可以保護二級廠商系統的獨立性和完整性。
安全引導功能的原理就是採用鏈式驗籤的方式啟動系統,也就是在系統啟動過程中,在載入下一個階段的映象之前都會對需要被載入的映象檔案進行電子驗籤,只有驗籤操作透過後,該映象才能被載入到記憶體中,然後系統才會跳轉到下一個階段繼續執行,整個驗籤鏈中的任何一環驗籤失敗都會導致系統掛死,系統啟動過程中的第一級驗籤操作是由Chip ROM來完成的。
只要晶片一出廠,使用者就無法修改固化在晶片中的這部分程式碼,因此無法透過修改第一級驗簽結果來關閉安全引導功能。而且驗籤操作使用的RSA公鑰或者雜湊值將會被儲存在OTP/efuse中,該區域中的資料一般只有Chip ROM和TEE能夠讀取且無法被修改。RSA公鑰或者雜湊值將會在產品出廠之前被寫入到OTP/efuse中,而且不同廠商使用的金鑰會不一樣。
安全引導可用於保證系統的完整性,防止系統中重要映象檔案被破壞或替換。一般情況下,安全引導需要保護:
- 系統的BootLoader映象檔案
- TEE映象檔案(TEE,Trusted Execution Environment,可信執行環境)
- Linux核心映象檔案
- Recover映象檔案
- 在ARMv8中使用的ATF映象檔案
將TEE映象檔案的載入操作加入安全引導功能中可阻止駭客透過替換TEE映象檔案的方式來竊取被TEE保護的重要資料。
當前使用ARM晶片的系統中大部分使能了安全引導功能,該功能對於使用者的最直接感受就是,當使用者非法刷入其他廠商的ROM後無法正常啟動,這是因為非法刷機將導致系統中的重要映象檔案被替換,系統在啟動過程中對映象檔案的電子驗籤失敗,如果BootLoader驗證失敗,則系統在進入BootLoader階段之前就會掛死。
在ARMv8架構中ARM提供了ARM可信韌體(ATF)。Bootloader、Linux核心、TEE OS的啟動都由ATF來載入和引導。對於ARMv8, Bootloader、Linux核心和TEE OS映象檔案的驗籤工作都是在ATF中完成的。
2.2 ARM Trust Zone簡介
Trust Zone 是 ARM 為裝置安全開發的一個硬體架構。它透過硬體隔離的方式將系統分為了兩個環境——Non Secure 和 Secure ,也叫做 Normal 和 Trusted。Normal 環境中可以執行地軟體比較豐富和複雜,比如 Linux,因此有時也稱在 Normal 環境為 REE(Rich Execution Environment)。在 Trusted 環境中執行地軟體很“小”,提供的功能也有限,通常稱 Trusted 為 TEE(Trusted Execution Environment,可信執行環境)。
硬體隔離是說是使用 TrustZone 可以將裝置中的外設(UART、I2C、SPI、DDR 等)分為兩個部分,其中一部分可以在 Normal 環境下進行操作,另外一部分在 Trusted 的環境下進行操作。硬體隔離實現在兩個方面:晶片外設隔離、記憶體隔離(對於DDR,需要將整個區域劃分為若干安全和非安全區域。透過TZASC可實現)。示意圖如下所示。
2.3 ATF簡介
ATF 在CPU和記憶體中區隔出兩個空間:Secure空間和Non-Secure空間,同時劃分了EL0(Exception level 0)到EL3四個特權級;其中EL0和EL1是ATF必須實現的,EL2和EL3是可選的。實際上,沒有EL2和EL3,整個模型就基本退化成了ARMv7的TZ版本。ATF帶來最大的變化是信任鏈的建立(Trust Chain),整個啟動過程包括從EL3到EL0的信任關係的打通,過程比較抽象。
根據上圖可以看出劃分中EL0、EL1、EL2都存在安全/非安全兩種狀態,EL3一直處於安全狀態。由此非安全部分包括:NS.EL0、NS.EL1、NS.EL2;安全部分包括 EL3、S.EL2(ARMv8.4新增)、S.EL1、S.EL0。無論從安全切換到非安全,還是非安全切換到安全都需要經過EL3,從NS.EL1切換到S.EL1流程圖如下:
- Rich OS透過SMC異常進入EL3。
- EL3中執行對應的異常處理函式,並進行SCTLR_EL3.NS位設定1->0;儲存非安全暫存器狀態;恢復安全暫存器狀態。
- 從異常處理中退出並將CPU從EL3切換到S.EL1。
NOTE:SMC是在Trust Zone中引入的方法,是為了在安全區和非安全進行切換時的介面。