電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 90|回復(fù): 0
收起左側(cè)

深入理解SoC上電和boot流程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
匿名  發(fā)表于 2024-10-15 11:45:00 回帖獎勵 |倒序瀏覽 |閱讀模式
——————————————————————————————
版權(quán)聲明:
本文作者:烓圍瑋未。主要從事ISP/MIPI/SOC/車規(guī)芯片設(shè)計/SOC架構(gòu)設(shè)計
首發(fā)于知乎專欄:芯片設(shè)計進(jìn)階之路
微信公眾號:芯片設(shè)計進(jìn)階之路(x_chip)
轉(zhuǎn)發(fā)必須授權(quán),同時保留這段聲明,盜版必究!
——————————————————————————————
當(dāng)SoC芯片流片回來后,并不是直接通電就可以使用的。需要進(jìn)行上電復(fù)位,然后對SoC進(jìn)行配置使其進(jìn)入到正常工作狀態(tài),然后才能運行正常的程序和任務(wù)。這是一個比較復(fù)雜的過程,也是在芯片設(shè)計階段,SoC需要重點考慮的問題。上電不能成功,芯片流片回來直接就不能啟動,這也是最重大的失敗,所以保證芯片能正常上電啟動是SoC設(shè)計最重要的第一步。
由于SoC各種各樣,不同是SoC的啟動流程是有區(qū)別的,但是大部分SoC遵循著基本的流程:
  • 上電復(fù)位:芯片通電后,所有寄存器和內(nèi)存被重置到初始狀態(tài)。
  • Boot階段:初始化硬件;
  • 操作系統(tǒng)啟動:內(nèi)核初始化,加載驅(qū)動,掛載文件系統(tǒng)。
  • 用戶空間初始化:啟動系統(tǒng)服務(wù)和用戶界面。
    [/ol]這個過程確保了SOC從斷電狀態(tài)到操作系統(tǒng)完全運行的平滑過渡。下面詳細(xì)說明每個階段的內(nèi)容。
    上電復(fù)位(Power-On Reset)當(dāng)SOC通電或復(fù)位信號觸發(fā)時,SOC進(jìn)入復(fù)位狀態(tài)。復(fù)位電路會將所有寄存器和內(nèi)存重置為已知的初始狀態(tài),確保系統(tǒng)從一個干凈的狀態(tài)開始啟動。
    Power-On Reset縮寫為POR,這是一個非常常見的縮寫,需要記住
    這個階段還需要準(zhǔn)備好Boot Mode Pin,確定Boot的介質(zhì),Boot Mode在POR釋放時候鎖存。
    POR釋放后開始reset flow階段,SoC內(nèi)部一般有一個控制reset sequence的狀態(tài)機FSM,來進(jìn)行啟動階段的reset。這個reset的控制和SoC內(nèi)部實現(xiàn)強相關(guān),不同的SoC有不同的實現(xiàn)方式。
    同時還會完成下面任務(wù):
  • 確認(rèn)PLL輸出時鐘穩(wěn)定;
  • 會啟動必要的外設(shè)的時鐘;
  • 釋放必要的模塊的reset;
  • 使用OTP配置內(nèi)部模塊;
  • 進(jìn)行進(jìn)行Power-On Self-Test(POST)等
    [/ol]越是復(fù)雜的SoC,在這個階段需要做的事情越多。
    Boot階段系統(tǒng)引導(dǎo)程序在遙遠(yuǎn)的單片機時代,嵌入式設(shè)備功能比較單一,每個設(shè)備只需要執(zhí)行一件簡單的任務(wù),因此在系統(tǒng)初始化完成后,程序就運行在一個大循環(huán)中,此時,系統(tǒng)啟動流程和功能代碼并沒有很嚴(yán)格的區(qū)分。隨著技術(shù)的發(fā)展,嵌入式系統(tǒng)變得越來越復(fù)雜,單片機(MCU)和系統(tǒng)級芯片(SoC)之間的差異也越來越明顯。在早期的單片機時代,設(shè)備的處理能力有限,通常只需要執(zhí)行一些簡單的任務(wù),如控制一個電機或者讀取傳感器數(shù)據(jù)。這些任務(wù)通常可以通過一個簡單的程序循環(huán)來實現(xiàn),不需要復(fù)雜的操作系統(tǒng)。
    然而,隨著SoC的出現(xiàn),情況發(fā)生了變化。SoC通常包含多個處理器核心、圖形處理單元(GPU)、數(shù)字信號處理器(DSP)、以及其他專用硬件模塊,如網(wǎng)絡(luò)接口、存儲控制器等。這些復(fù)雜的硬件需要更高級的管理,以便它們能夠協(xié)同工作,提供更豐富的功能。
    系統(tǒng)引導(dǎo)程序(Bootloader)在SoC中扮演著至關(guān)重要的角色。它的主要任務(wù)包括:
    硬件初始化:在系統(tǒng)上電后,引導(dǎo)程序首先需要初始化硬件,包括設(shè)置時鐘、配置內(nèi)存、初始化外設(shè)等。
    安全啟動:為了保護(hù)系統(tǒng)不被惡意軟件攻擊,引導(dǎo)程序會檢查操作系統(tǒng)映像的完整性和合法性。
    配置系統(tǒng)環(huán)境:設(shè)置系統(tǒng)運行所需的參數(shù),如CPU工作模式、內(nèi)存管理單元(MMU)配置等。
    加載操作系統(tǒng):將操作系統(tǒng)映像從存儲設(shè)備(如閃存、硬盤)加載到內(nèi)存中。
    跳轉(zhuǎn)到操作系統(tǒng):一旦操作系統(tǒng)加載完成,引導(dǎo)程序會將控制權(quán)交給操作系統(tǒng),讓操作系統(tǒng)接管系統(tǒng)的控制。
    [/ol]這些操作系統(tǒng)或啟動程序是由c或者c++等程序?qū)懗傻,編譯成.bin或者.hex文件,存儲到非易失性存儲器中,或者存儲在外部存儲設(shè)備上。這些文件被稱為鏡像文件(image)
    BootROM和XIP在系統(tǒng)初始化時,cpu只能訪問可以直接尋址的存儲器:
  • 如果支持XIP啟動方式,可被存儲在片外可直接執(zhí)行的介質(zhì)中(如NOFLASH);
  • 如果不支持XIP啟動,則需要存儲到芯片內(nèi)部的ROM中,也就是最常見的BootROM;
    [/ol]在芯片出廠后該部分代碼就將被固化,后續(xù)再也不能被修改和升級。若芯片要支持安全啟動,則需要將BOOTROM作為啟動時的信任根,此時除調(diào)試階段外,SOC必須禁用XIP。
    BOOT流程一般情況下都會采用內(nèi)部ROM的方式進(jìn)行boot,如果內(nèi)部ROM出問題了,可以采用XIP進(jìn)行debug或者作為備份。
    典型的boot流程一般分為:
    First stage (BootRom)->Second Stage (u-boot/bare metal)
    兩個階段。對不同的cpu架構(gòu),規(guī)定的boot流程規(guī)范是不同的。
    ARM boot流程ARM V8 Boot流程:
    Armv8的啟動流程包含多個階段,典型地有BL1、BL2、BL31、BL32、BL33,根據(jù)需求的不同,這些階段可以適當(dāng)?shù)夭眉艋蛱砑印?br /> 它們的源碼會被編譯成獨立的啟動鏡像,并被保存到特定的存儲介質(zhì)中。由于一般的存儲介質(zhì)(如SPI Flash,nand flash、emmc、ssd等)都不支持代碼的直接執(zhí)行,因此需要在啟動時先將鏡像加載到可直接執(zhí)行代碼的存儲介質(zhì),如SRAM中,然后運行相關(guān)代碼。其典型的加載流程如下:

    在ARMv8架構(gòu)中,啟動流程包含多個階段,這些階段通常被稱為BL(Bootloader)階段:
  • BL1:這是第一階段的啟動固件,通常位于ROM中,負(fù)責(zé)引導(dǎo)BL2并對其進(jìn)行安全驗證。
  • BL2:第二階段的啟動固件,通常存儲在Flash中,負(fù)責(zé)平臺相關(guān)的初始化,比如內(nèi)存(DDR)初始化,并尋找BL31或BL33執(zhí)行。
  • BL31:如果存在,BL2會加載BL31。BL31是持久存在的可信固件,負(fù)責(zé)系統(tǒng)安全服務(wù)和在安全與非安全世界之間切換。
  • BL32(可選):通常包含OP-TEE OS和安全應(yīng)用,運行在EL1,啟動EL0的安全應(yīng)用,完成后返回BL31。
  • BL33:這是非安全世界的啟動固件,通常是U-Boot或者直接啟動Linux內(nèi)核。
    [/ol]這里說明一下:
    armv8架構(gòu)分為Secure World和Non-Secure World(Normal World),四種異常級別從高到低分別為EL3,EL2,EL1,EL0。
    安全世界與非安全世界:
  • Secure World:執(zhí)行可信的固件和應(yīng)用,如支付、指紋識別等。
  • Non-Secure World:運行常見的操作系統(tǒng)和裸機程序。
    異常級別:
  • EL3:最高權(quán)限級別,負(fù)責(zé)安全監(jiān)控和模式切換。
  • EL2:提供虛擬化支持。
  • EL1:特權(quán)模式,運行操作系統(tǒng)或安全OS。
  • EL0:無特權(quán)模式,運行應(yīng)用程序。所有APP應(yīng)用都在EL0。
    完整的調(diào)用流程如下:

    ARM Trusted Firmware (ATF) 是為 ARMv8-A 架構(gòu)設(shè)計的一套開源安全固件,它實現(xiàn)了從芯片啟動到操作系統(tǒ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啟動,則必須要從secure空間開始啟動,且啟動完成后需要通過secure monitor(BL31)完成normal os對secure空間服務(wù)相關(guān)請求的處理。
    不支持ATF的啟動
    如果不支持ATF,那么階段對應(yīng)關(guān)系如下:
    BL1: BootROM;
    BL2: SPL(Secondary Program Loader),SPL在啟動鏈中一般由bootrom加載而作為第二級啟動鏡像(bl2),它主要用于完成一些基礎(chǔ)模塊和ddr的初始化,以及加載下一級鏡像uboot。
    BL33:最常見的是u-boot;
    這時候流程為:

    由于SPL需要被加載到SRAM中執(zhí)行,對于有些sram size比較小的系統(tǒng),可能無法放入整個spl鏡像,TPL即是為了解決該問題引入的。
    TPL: Tertiary Program Loader,三級加載器
    加入了TPL之后,可將SPL的功能進(jìn)一步劃分為兩部分,如SPL包含ddr初始化相關(guān)代碼,而TPL包含鏡像加載相關(guān)驅(qū)動,從而減少SPL鏡像的size。此時啟動流程可被設(shè)計為如下方式:

    支持ATF的啟動
    支持ATF的啟動就是上面所述的完整的ARM V8啟動流程:

    ATF啟動uboot的典型鏡像跳轉(zhuǎn)流程如下:

    在以上流程中BL32是可選的,若不支持trust os則可裁剪掉該流程。典型情況下BL33為uboot,而BL2既可以使用ATF實現(xiàn)也可以用SPL實現(xiàn)。
    ATF 還支持從 BL1 直接跳轉(zhuǎn)到 BL31 的啟動模式,這種方式可以加快啟動速度,因為它跳過了 BL2 的加載過程。此外,ATF 還支持固件更新和恢復(fù)模式。
    ATF 的啟動流程是高度可定制的,不同的芯片廠商可能會根據(jù)自己的需求進(jìn)行調(diào)整。
    RSIC-V BOOT流程先介紹一下RSIC-V的幾種模式:
    M-mode(Machine Mode)
    S-mode(Supervisor Mode)
    U-mode(User Mode)
    [/ol]對比ARM架構(gòu)如下:

    對于arm64來說,系統(tǒng)上電后啟動會處于EL3 secure world ,所以對于arm64來說,一般都會使用ARM Trusted firmware (TF-A)  在normal world EL2 與 secure EL3  進(jìn)行切換。
    而對于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內(nèi)存。
    BBL (Berkeley Boot Loader):提供加載,并且管理著二進(jìn)制接口(SBI)。
    操作系統(tǒng)加載:如Linux內(nèi)核的加載和啟動。


    操作系統(tǒng)啟動當(dāng)引導(dǎo)加載程序加載操作系統(tǒng)內(nèi)核并將控制權(quán)移交給內(nèi)核后,操作系統(tǒng)的啟動過程正式開始。這個階段包括內(nèi)核初始化、硬件設(shè)備驅(qū)動程序初始化、掛載根文件系統(tǒng)以及初始進(jìn)程啟動。
    用戶空間初始化在操作系統(tǒng)內(nèi)核成功啟動后,系統(tǒng)進(jìn)入用戶空間初始化階段。這包括啟動腳本和服務(wù)、用戶登錄和圖形界面的啟動,為用戶提供交互界面。
    這兩個部分主要涉及到軟件,內(nèi)容比較復(fù)雜,就不展開討論。
    后記技術(shù)很重要,技術(shù)背后的思想更重要!
    技術(shù)背后的某些思想就是你解決以后問題的鑰匙。我的文章可能一篇中知識點不太多,但是力求讓你能深入理解,為你進(jìn)階打下基礎(chǔ)。如果有一點點收獲,也算是我對中國芯片行業(yè)的一點點貢獻(xiàn)吧。
    贈人玫瑰,手有余香。如果你有所收獲,麻煩花一秒時間幫我點個贊和在看吧,謝謝!
    知乎專欄:芯片設(shè)計進(jìn)階之路
    微信公眾號:芯片設(shè)計進(jìn)階之路 x_chip
    ——————————————————————————————
  • 本帖子中包含更多資源

    您需要 登錄 才可以下載或查看,沒有賬號?立即注冊

    x
    回復(fù)

    使用道具

    發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表