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

PCB聯(lián)盟網

搜索
查看: 131|回復: 0
收起左側

深入理解SoC上電和boot流程

[復制鏈接]
跳轉到指定樓層
樓主
匿名  發(fā)表于 2024-10-15 11:45:00 回帖獎勵 |倒序瀏覽 |閱讀模式
——————————————————————————————
版權聲明:
本文作者:烓圍瑋未。主要從事ISP/MIPI/SOC/車規(guī)芯片設計/SOC架構設計
首發(fā)于知乎專欄:芯片設計進階之路
微信公眾號:芯片設計進階之路(x_chip)
轉發(fā)必須授權,同時保留這段聲明,盜版必究!
——————————————————————————————
當SoC芯片流片回來后,并不是直接通電就可以使用的。需要進行上電復位,然后對SoC進行配置使其進入到正常工作狀態(tài),然后才能運行正常的程序和任務。這是一個比較復雜的過程,也是在芯片設計階段,SoC需要重點考慮的問題。上電不能成功,芯片流片回來直接就不能啟動,這也是最重大的失敗,所以保證芯片能正常上電啟動是SoC設計最重要的第一步。
由于SoC各種各樣,不同是SoC的啟動流程是有區(qū)別的,但是大部分SoC遵循著基本的流程:
  • 上電復位:芯片通電后,所有寄存器和內存被重置到初始狀態(tài)。
  • Boot階段:初始化硬件;
  • 操作系統(tǒng)啟動:內核初始化,加載驅動,掛載文件系統(tǒng)。
  • 用戶空間初始化:啟動系統(tǒng)服務和用戶界面。
    [/ol]這個過程確保了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)等
    [/ol]越是復雜的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)的控制。
    [/ol]這些操作系統(tǒng)或啟動程序是由c或者c++等程序寫成的,編譯成.bin或者.hex文件,存儲到非易失性存儲器中,或者存儲在外部存儲設備上。這些文件被稱為鏡像文件(image)
    BootROM和XIP在系統(tǒng)初始化時,cpu只能訪問可以直接尋址的存儲器:
  • 如果支持XIP啟動方式,可被存儲在片外可直接執(zhí)行的介質中(如NOFLASH);
  • 如果不支持XIP啟動,則需要存儲到芯片內部的ROM中,也就是最常見的BootROM;
    [/ol]在芯片出廠后該部分代碼就將被固化,后續(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ù)夭眉艋蛱砑印?br /> 它們的源碼會被編譯成獨立的啟動鏡像,并被保存到特定的存儲介質中。由于一般的存儲介質(如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內核。
    [/ol]這里說明一下:
    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)
    [/ol]對比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è)的一點點貢獻吧。
    贈人玫瑰,手有余香。如果你有所收獲,麻煩花一秒時間幫我點個贊和在看吧,謝謝!
    知乎專欄:芯片設計進階之路
    微信公眾號:芯片設計進階之路 x_chip
    ——————————————————————————————
  • 本帖子中包含更多資源

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

    x
    回復

    使用道具

    發(fā)表回復

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

    本版積分規(guī)則


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