深入理解SoC上電和boot流程
掃描二維碼
隨時隨地手機看文章
當SoC芯片流片回來后,并不是直接通電就可以使用的。需要進行上電復位,然后對SoC進行配置使其進入到正常工作狀態(tài),然后才能運行正常的程序和任務。這是一個比較復雜的過程,也是在芯片設計階段,SoC需要重點考慮的問題。上電不能成功,芯片流片回來直接就不能啟動,這也是最重大的失敗,所以保證芯片能正常上電啟動是SoC設計最重要的第一步。
由于SoC各種各樣,不同是SoC的啟動流程是有區(qū)別的,但是大部分SoC遵循著基本的流程:
-
上電復位:芯片通電后,所有寄存器和內存被重置到初始狀態(tài)。
-
Boot階段:初始化硬件;
-
操作系統(tǒng)啟動:內核初始化,加載驅動,掛載文件系統(tǒng)。
-
用戶空間初始化:啟動系統(tǒng)服務和用戶界面。
這個過程確保了SOC從斷電狀態(tài)到操作系統(tǒng)完全運行的平滑過渡。下面詳細說明每個階段的內容。
上電復位(Power-On Reset)
當SOC通電或復位信號觸發(fā)時,SOC進入復位狀態(tài)。復位電路會將所有寄存器和內存重置為已知的初始狀態(tài),確保系統(tǒng)從一個干凈的狀態(tài)開始啟動。
Power-On Reset縮寫為POR,這是一個非常常見的縮寫,需要記住。
這個階段還需要準備好Boot Mode Pin,確定Boot的介質,Boot Mode在POR釋放時候鎖存。
POR釋放后開始reset flow階段,SoC內部一般有一個控制reset sequence的狀態(tài)機FSM,來進行啟動階段的reset。這個reset的控制和SoC內部實現(xiàn)強相關,不同的SoC有不同的實現(xiàn)方式。
同時還會完成下面任務:
-
確認PLL輸出時鐘穩(wěn)定;
-
會啟動必要的外設的時鐘;
-
釋放必要的模塊的reset;
-
使用OTP配置內部模塊;
-
進行進行Power-On Self-Test(POST)等
越是復雜的SoC,在這個階段需要做的事情越多。
Boot階段
系統(tǒng)引導程序
在遙遠的單片機時代,嵌入式設備功能比較單一,每個設備只需要執(zhí)行一件簡單的任務,因此在系統(tǒng)初始化完成后,程序就運行在一個大循環(huán)中,此時,系統(tǒng)啟動流程和功能代碼并沒有很嚴格的區(qū)分。隨著技術的發(fā)展,嵌入式系統(tǒng)變得越來越復雜,單片機(MCU)和系統(tǒng)級芯片(SoC)之間的差異也越來越明顯。在早期的單片機時代,設備的處理能力有限,通常只需要執(zhí)行一些簡單的任務,如控制一個電機或者讀取傳感器數(shù)據(jù)。這些任務通??梢酝ㄟ^一個簡單的程序循環(huán)來實現(xiàn),不需要復雜的操作系統(tǒng)。
然而,隨著SoC的出現(xiàn),情況發(fā)生了變化。SoC通常包含多個處理器核心、圖形處理單元(GPU)、數(shù)字信號處理器(DSP)、以及其他專用硬件模塊,如網絡接口、存儲控制器等。這些復雜的硬件需要更高級的管理,以便它們能夠協(xié)同工作,提供更豐富的功能。
系統(tǒng)引導程序(Bootloader)在SoC中扮演著至關重要的角色。它的主要任務包括:
-
硬件初始化:在系統(tǒng)上電后,引導程序首先需要初始化硬件,包括設置時鐘、配置內存、初始化外設等。
-
安全啟動:為了保護系統(tǒng)不被惡意軟件攻擊,引導程序會檢查操作系統(tǒng)映像的完整性和合法性。
-
配置系統(tǒng)環(huán)境:設置系統(tǒng)運行所需的參數(shù),如CPU工作模式、內存管理單元(MMU)配置等。
-
加載操作系統(tǒng):將操作系統(tǒng)映像從存儲設備(如閃存、硬盤)加載到內存中。
-
跳轉到操作系統(tǒng):一旦操作系統(tǒng)加載完成,引導程序會將控制權交給操作系統(tǒng),讓操作系統(tǒng)接管系統(tǒng)的控制。
這些操作系統(tǒng)或啟動程序是由c或者c++等程序寫成的,編譯成.bin或者.hex文件,存儲到非易失性存儲器中,或者存儲在外部存儲設備上。這些文件被稱為鏡像文件(image)
BootROM和XIP
在系統(tǒng)初始化時,cpu只能訪問可以直接尋址的存儲器:
-
如果支持XIP啟動方式,可被存儲在片外可直接執(zhí)行的介質中(如NOFLASH);
-
如果不支持XIP啟動,則需要存儲到芯片內部的ROM中,也就是最常見的BootROM;
在芯片出廠后該部分代碼就將被固化,后續(xù)再也不能被修改和升級。若芯片要支持安全啟動,則需要將BOOTROM作為啟動時的信任根,此時除調試階段外,SOC必須禁用XIP。
BOOT流程
一般情況下都會采用內部ROM的方式進行boot,如果內部ROM出問題了,可以采用XIP進行debug或者作為備份。
典型的boot流程一般分為:
First stage (BootRom)->Second Stage (u-boot/bare metal)
兩個階段。對不同的cpu架構,規(guī)定的boot流程規(guī)范是不同的。
ARM boot流程
ARM V8 Boot流程:
Armv8的啟動流程包含多個階段,典型地有BL1、BL2、BL31、BL32、BL33,根據(jù)需求的不同,這些階段可以適當?shù)夭眉艋蛱砑印?
它們的源碼會被編譯成獨立的啟動鏡像,并被保存到特定的存儲介質中。由于一般的存儲介質(如SPI Flash,nand flash、emmc、ssd等)都不支持代碼的直接執(zhí)行,因此需要在啟動時先將鏡像加載到可直接執(zhí)行代碼的存儲介質,如SRAM中,然后運行相關代碼。其典型的加載流程如下:
在ARMv8架構中,啟動流程包含多個階段,這些階段通常被稱為BL(Bootloader)階段:
-
BL1:這是第一階段的啟動固件,通常位于ROM中,負責引導BL2并對其進行安全驗證。
-
BL2:第二階段的啟動固件,通常存儲在Flash中,負責平臺相關的初始化,比如內存(DDR)初始化,并尋找BL31或BL33執(zhí)行。
-
BL31:如果存在,BL2會加載BL31。BL31是持久存在的可信固件,負責系統(tǒng)安全服務和在安全與非安全世界之間切換。
-
BL32(可選):通常包含OP-TEE OS和安全應用,運行在EL1,啟動EL0的安全應用,完成后返回BL31。
-
BL33:這是非安全世界的啟動固件,通常是U-Boot或者直接啟動Linux內核。
這里說明一下:
armv8架構分為Secure World和Non-Secure World(Normal World),四種異常級別從高到低分別為EL3,EL2,EL1,EL0。
安全世界與非安全世界:
-
Secure World:執(zhí)行可信的固件和應用,如支付、指紋識別等。
-
Non-Secure World:運行常見的操作系統(tǒng)和裸機程序。
異常級別:
-
EL3:最高權限級別,負責安全監(jiān)控和模式切換。
-
EL2:提供虛擬化支持。
-
EL1:特權模式,運行操作系統(tǒng)或安全OS。
-
EL0:無特權模式,運行應用程序。所有APP應用都在EL0。
完整的調用流程如下:
ARM Trusted Firmware (ATF) 是為 ARMv8-A 架構設計的一套開源安全固件,它實現(xiàn)了從芯片啟動到操作系統(tǒng)加載的整個過程中的安全啟動要求。ATF 支持 ARM 的 TrustZone 技術,提供了Secure和Non-Secure執(zhí)行環(huán)境之間的隔離。
BL2根據(jù)是否存在BL31和BL32可選擇性的加載不同firmware,若系統(tǒng)需要支持Secure和Non-Secure兩種執(zhí)行狀態(tài),也就是支持ATF啟動,則必須要從secure空間開始啟動,且啟動完成后需要通過secure monitor(BL31)完成normal os對secure空間服務相關請求的處理。
不支持ATF的啟動
如果不支持ATF,那么階段對應關系如下:
BL1: BootROM;
BL2: SPL(Secondary Program Loader),SPL在啟動鏈中一般由bootrom加載而作為第二級啟動鏡像(bl2),它主要用于完成一些基礎模塊和ddr的初始化,以及加載下一級鏡像uboot。
BL33:最常見的是u-boot;
這時候流程為:
由于SPL需要被加載到SRAM中執(zhí)行,對于有些sram size比較小的系統(tǒng),可能無法放入整個spl鏡像,TPL即是為了解決該問題引入的。
TPL: Tertiary Program Loader,三級加載器
加入了TPL之后,可將SPL的功能進一步劃分為兩部分,如SPL包含ddr初始化相關代碼,而TPL包含鏡像加載相關驅動,從而減少SPL鏡像的size。此時啟動流程可被設計為如下方式:
支持ATF的啟動
支持ATF的啟動就是上面所述的完整的ARM V8啟動流程:
ATF啟動uboot的典型鏡像跳轉流程如下:
在以上流程中BL32是可選的,若不支持trust os則可裁剪掉該流程。典型情況下BL33為uboot,而BL2既可以使用ATF實現(xiàn)也可以用SPL實現(xiàn)。
ATF 還支持從 BL1 直接跳轉到 BL31 的啟動模式,這種方式可以加快啟動速度,因為它跳過了 BL2 的加載過程。此外,ATF 還支持固件更新和恢復模式。
ATF 的啟動流程是高度可定制的,不同的芯片廠商可能會根據(jù)自己的需求進行調整。
RSIC-V BOOT流程
先介紹一下RSIC-V的幾種模式:
-
M-mode(Machine Mode)
-
S-mode(Supervisor Mode)
-
U-mode(User Mode)
對比ARM架構如下:
對于arm64來說,系統(tǒng)上電后啟動會處于EL3 secure world ,所以對于arm64來說,一般都會使用ARM Trusted firmware (TF-A) 在normal world EL2 與 secure EL3 進行切換。
而對于risc-v來說,系統(tǒng)上電啟動后會在M-Mode,而risc-v目前是沒有Hypervisor這一層的概念的,所以目前采用的是opensbi。
啟動流程:RISC-V的啟動流程可能包括以下幾個階段:
-
ZSBL (Zeroth Stage Boot Loader):片上ROM程序。
-
FSBL (First Stage Boot Loader):啟動PLLs和初始化DDR內存。
-
BBL (Berkeley Boot Loader):提供加載,并且管理著二進制接口(SBI)。
-
操作系統(tǒng)加載:如Linux內核的加載和啟動。
操作系統(tǒng)啟動
當引導加載程序加載操作系統(tǒng)內核并將控制權移交給內核后,操作系統(tǒng)的啟動過程正式開始。這個階段包括內核初始化、硬件設備驅動程序初始化、掛載根文件系統(tǒng)以及初始進程啟動。
用戶空間初始化
在操作系統(tǒng)內核成功啟動后,系統(tǒng)進入用戶空間初始化階段。這包括啟動腳本和服務、用戶登錄和圖形界面的啟動,為用戶提供交互界面。
這兩個部分主要涉及到軟件,內容比較復雜,就不展開討論。
后記
技術很重要,技術背后的思想更重要!
技術背后的某些思想就是你解決以后問題的鑰匙。我的文章可能一篇中知識點不太多,但是力求讓你能深入理解,為你進階打下基礎。如果有一點點收獲,也算是我對中國芯片行業(yè)的一點點貢獻吧。
贈人玫瑰,手有余香。如果你有所收獲,麻煩花一秒時間幫我點個贊和在看吧,謝謝!





