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