檔案系統(三):嵌入式、計算機系統啟動流程與步驟

liwen01發表於2024-04-16

liwen01 2024.04.14

前言

我們身邊的各種電子裝置,手機、手錶、相機、個人電腦等等,從使用者體驗的角度看,好像只要給它們一上電,它們就開始啟動可以工作了,這個過程一般是比較短暫的。

從一個嵌入式開發的角度來看,不管是嵌入式系統,還是其它的計算機系統,其啟動過程都是一個相對複雜的過程。這個過程一旦出錯,基本上裝置就不能正常執行了。

(一)嵌入式系統啟動

(1)儲存架構示意圖

我們先看一個嵌入式系統的儲存架構示意圖

檔案系統(三):嵌入式、計算機系統啟動流程與步驟

嵌入式裝置的儲存介質一般有NOR FlashNAND FlashSD卡EEPROM等,其中根據Flash介面的不同,又可以分期序列Flash(SPI Flash)並行Flash。在晶片內部有它們對應的控制器。

於此同時,一般在晶片的內部,都會有一個比較小的SRAM和ROM,我們一般稱它為內部SRAM和內部ROM。

我們的程式,包括系統程式和應用程式,一般都是存放在這些外接的儲存介質上。

(2)啟動過程

  1. 晶片上電執行的第一條程式,不是執行放置在外部Flash中的Boot程式,執行的是內部ROM上的程式
  2. 內部ROM裡面的程式,會根據BOOT_SEL引腳的電平狀態,判斷需要從哪個儲存器中啟動,然後初始化該儲存器的介面
  3. 儲存器介面初始化完成後,將儲存裝置最開始的一小段程式程式(一般4~5K)載入到內部SRAM,透過這一小部分程式去初始化外部的DDR記憶體
  4. 外部DDR初始化完之後,再將Flash中剩下的程式碼複製到外部DDR中,然後再跳轉到外部DDR中去執行BOOT剩下的程式碼
  5. DDR上的BOOT程式會去初始化硬體並引導kernel的啟動,隨後kernel去掛載根檔案系統
  6. 根檔案系統去執行應用程式、並掛載在儲存器上其它分割槽上的檔案系統

這裡需要對幾個知識點需要注意:

  • 並不是所有的系統都有BOOT_SEL引腳,在有些SOC上,還會透過BOOT_SEL引腳判斷是否在燒錄模式
  • 如果去分析boot的編譯連線指令碼,你會發現,放置在boot程式最前面4K位置的程式碼,都是一些初始化、程式碼複製、重定位的程式碼,這部分一般是彙編實現。
  • 因為內部SRAM的空間很小,所以內部ROM上的程式才會只複製前面的一小段程式。
  • 啟動過程的1~4步驟,有叫BOOT的自舉,也有的叫BOOT 的重定位。

(3)啟動階段

檔案系統(三):嵌入式、計算機系統啟動流程與步驟

其實不管是嵌入式系統,還是其它的計算機系統,其啟動過程大概都可以分為三個階段

  • ROM 階段
  • RAM 階段
  • BOOT 階段

ROM階段:指的是處理器內部的ROM程式階段,主要作用是載入儲存頭部的一小段程式到內部RAM上,這部分的程式一般是使用匯編來實現。

RAM階段:是指外部DDR已經被初始化,並且儲存器中的程式已經被重定位到外部DDR上,從這開始,程式的堆疊空間可以被建立起來,C語言可以開始執行。

BOOT階段:是指開始其它外圍硬體初始化和引導系統啟動。

(二)計算機系統啟動

計算機系統因為歷史悠久,外設種類眾多,它的啟動流程會複雜一些,根據韌體型別(BIOS或UEFI)和分割槽表型別(MBR或GPT)的不同,計算機的啟動一般可以分為BIOS啟動UEFI啟動兩種。

查資料看文件發現BIOS、UEFI、LEGACY這幾個概念有些混亂,沒有統一的定義。對大部分來說,它們理解的引導計算機啟動的程式就叫BIOS

因此在這之前,我們統一一下說法,計算透過BIOS引導系統啟動,根據BIOS韌體的不同和磁碟的分割槽型別不同,又可以分為兩種方式:LEGACY(傳統BIOS)UEFI啟動

檔案系統(三):嵌入式、計算機系統啟動流程與步驟

(1)計算機主機板介面與元件介紹

要了解計算機的啟動流程,我們先看下一臺個人計算機的主機板上都有些什麼介面和元件

檔案系統(三):嵌入式、計算機系統啟動流程與步驟

檔案系統(三):嵌入式、計算機系統啟動流程與步驟

主要的元件有:電源CPU南橋北橋晶片組BIOS晶片磁碟介面、還有各種擴充套件介面和聯結器(記憶體、顯示卡、網路卡音效卡等等)

與啟動比較相關的是電源CPU南北橋晶片組BIOS晶片磁碟記憶體

(1)ATX電源ATX是一種主機板的規範、符合ATX規範的電源就叫ATX電源,它的作用是是把交流220V的電源轉換為計算機內部使用的5V、12V、24V等不同壓值的直流電源。

另外,它還支援電源管理, ATX電源標準介面(如PS_ON、PWR_OK等)與主機板通訊,以實現電源的管理和控制,包括開機、關機、睡眠模式和節能功能等。

(2)嵌入式控制器(EC)

EC(Embedded Controller)是膝上型電腦上的一個16位小晶片,在不同的裝置上,它的名字有些不一樣,功能也有些差異:

  • 桌上型電腦一般使用的是超級輸入輸出控制器(SIO)
  • 手機上一般使用的是功率管理積體電路(PMIC)
  • 筆記本上使用的是嵌入式控制器(EC)

EC的主要功能有:

  1. 電源管理
  2. 溫度監測和風扇控制
  3. 輸入裝置管理
  4. 系統監控與故障檢測
  5. 啟動時序管理
  6. 電池管理(適用於膝上型電腦)

(3)BIOS晶片

我們常說的BIOS(Basic Input/Output System,基本輸入/輸出系統),它其實是位於主機板上的一塊晶片,裡面儲存著BIOS程式。

它主要負責啟動、初始化計算機硬體,引導作業系統啟動。

最開始BIOS程式是儲存在ROM中,後面儲存在EEPROM,現在大多數都儲存在Nor Flash中,因為是儲存在Nor Flash 中,所以現在的BIOS 程式是可以被升級更新的。

(4)南橋與北橋

南橋和北橋是指計算機主機板上的兩個重要晶片組,它們協同工作以連線和管理主機板上的各種硬體元件。

北橋(Northbridge):

  • 位於主機板上靠近CPU的區域,負責處理與CPU及高速外設連線相關的任務。
  • 包括記憶體控制器、圖形介面(AGP或PCIe)、高速系統匯流排(例如FSB,Front Side Bus),負責管理CPU與記憶體之間的資料傳輸和控制顯示卡。
  • 在較新的主機板設計中,隨著技術的發展,一些功能逐漸整合到CPU中,北橋的功能逐漸減少。

南橋(Southbridge):

  • 位於主機板上較遠離CPU的區域,負責處理I/O裝置和外圍匯流排的控制。
  • 包括硬碟控制器、USB控制器、PCI匯流排、音效卡、網路卡等外圍裝置介面,負責管理和控制這些裝置。
  • 處理I/O裝置的低速操作,與北橋的高速匯流排相對應。

隨著技術的發展和新型架構的出現,北橋和南橋的功能劃分逐漸變得模糊。現代的晶片組設計趨向於整合更多的功能到單個晶片中,以提高效率並減少元件數量

(5)磁碟

磁碟在前面已經有過介紹

檔案系統(一):儲存介質、原理與架構

檔案系統(二):分割槽、格式化資料結構

(6)擴充套件介紹

不同的主機板規格,主機板上的介面和器件會有差異。

對於臺式計算機而言,關機和裝置斷電,它是處於不同的工作狀態的,關機狀態下,BIOS和主機板上的一些其它器件還是在工作的,比如跟開機按鍵檢測相關的一些器件。

桌上型電腦在斷電的時候,它裡面的時鐘也是有在執行,它是透過主機板上的紐扣電池來進行供電。紐扣電池最開始是為CMOS供電的,這裡的CMOS其實就是一個小的RAM,儲存的是使用者設定的一些BIOS引數,以及主機板器件的一些引數。

(2)LEGACY(BIOS) + MBR 方式啟動

LEGACY 方式它只能載入MBR分割槽格式的引導盤,它的啟動方式,大概可以分為6個階段:

  • CPU上電
  • BIOS硬體檢測
  • BIOS更新引數
  • BIOS交出控制權
  • 執行MBR載入程式
  • 活動分割槽載入作業系統

(a)CPU上電

  • 按下開機鍵,電源開始給主機板和其他器件供電,CPU開始初始化
  • 電源穩定後(電源會發出PWR_OK訊號),CPU開始從FFFF0H處開始執行指令
  • FFFF0H是BIOS器件在CPU的一個對映地址,這個地址程式的功能是跳轉到BIOS的程式碼處

(b)BIOS硬體檢測

  • BIOS 檢測系統中的關鍵器件是否正常,比如記憶體、顯示卡
  • BIOS 找到顯示卡後,呼叫顯示卡上初始化程式碼,完成顯示卡的初始化
  • BIOS 逐一的查詢主機板上的其它器件,看它們是否存在
  • BIOS 顯示自己的啟動畫面
  • 檢測CPU型別和CPU的頻率,並顯示在螢幕上
  • 檢測系統中的一些標準硬體裝置,比如硬碟,序列介面,並行介面等

(c)BIOS更新引數

  • BIOS完成硬體檢測完之後,會去更新ESCD(Extended System Configuration Data,擴充套件系統配置資料)
  • 實際是系統硬體配置發生變化才會去更新

(d)BIOS交出控制權

  • BIOS執行完ESCD更新操作後,BIOS會依次去查詢磁碟、光碟、隨身碟等裝置上是否有作業系統(該順序使用者可以透過BIOS引數設定)。
  • 傳統的LEGACY啟動方式,它只能識別MBR方式分割槽的儲存裝置
  • 探測到儲存裝置存在後,將啟動控制權交給MBR分割槽上的載入程式

(e)執行MBR載入程式

  • 先將第0扇區的512位元組複製到記憶體的一個安全區域去執行
  • 判斷第0扇區的最後兩個位元組是否為"55 AA",如果不是,提示出錯
  • 查詢分割槽表中是否有活動分割槽
  • 如果有活動分割槽,判斷活動分割槽所在的扇區位置
  • 將活動分割槽的引導扇區讀入記憶體中,並判斷資料是否合法
  • 如果活動扇區資料合法,就將引導權交給活動扇區
  • 活動扇區去引導作業系統啟動,MBR載入程式退出
  • 如果該MBR上沒有活動分割槽,引導權交還給BIOS,由BIOS去查詢下一個儲存裝置

(f)活動分割槽載入作業系統

  • MBR的載入程式找到活動分割槽後,會跳轉到活動分割槽所在為止,將引導權交給活動分割槽
  • 活動分割槽是指包含引導載入程式(Boot Loader)的分割槽,它負責載入作業系統的核心部分
  • 作業系統的引導是由作業系統的型別來決定的。

(3)UEFI+GPT 方式啟動

Windows系統中大概的一個啟動流程是:

  1. 計算機上電
  2. BIOS自檢
  3. UEFI韌體啟動
  4. 根據RAM中儲存的啟動順序載入啟動裝置
  5. 判斷啟動裝置中是否存在ESP分割槽,如果有則載入,沒有則下一個儲存器中查詢
  6. 讀取ESP分割槽中的EFI應用資訊,載入到BCD檔案
  7. 讀取BCD檔案下的記錄以載入系統

檔案系統(三):嵌入式、計算機系統啟動流程與步驟

在UEFI啟動模式中,大部分的工作是在ESP分割槽中進行

ESP分割槽ESP(EFI System Partition)是用於儲存 EFI(Extensible Firmware Interface)引導載入程式和相關引導檔案的分割槽。它是啟動過程中的重要組成部分,包含作業系統引導載入程式、配置檔案和其他與引導相關的檔案。

與啟動比較相關的是下面三個檔案:

  • EFI/Boot/bootx64.efi(或bootia32.efi)
  • EFI/Microsoft/Boot/bootmgfw.efi
  • EFI/Microsoft/Boot/BCD 其中必須要有的是:BCD和bootmgfw.efi 兩個檔案檔案

檔案系統(三):嵌入式、計算機系統啟動流程與步驟

UEFI BIOS 程式執行階段

一般分為7個過程:

步驟 階段縮寫 英文全稱 中文名字
1 SEC Security Phase 安全驗證階段
2 PEI Pre-EFI Initialization EFI前期初始化階段
3 DXE Driver Execution Environment 驅動執行環境階段
4 BDS Boot Device Selection 啟動裝置選擇階段
5 TSL Transitional System Load 作業系統載入前期階段
6 RT Runtime 系統執行時階段
7 AL System Recovery or Shutdown 系統災難恢復期或關機階段

1.SEC(安全驗證):安全驗證是UEFI啟動過程的第一步。在這個階段,執行UEFI韌體的固定程式碼,主要負責初始化CPU、記憶體和一些基本的系統硬體。

2.PEI(EFI前期初始化):在這個階段,UEFI韌體負責執行更多的硬體初始化,包括DRAM初始化,建立PEI系統服務,為後續的DXE階段做準備。

3.DXE(驅動執行環境):DXE階段是載入和執行UEFI驅動程式的階段。這些驅動程式可以是韌體驅動程式、外部裝置驅動程式等,以提供更多的硬體支援和功能。

4.BDS(啟動裝置選擇):在這個階段,UEFI選擇啟動裝置,例如硬碟、光碟、USB驅動器等。使用者可以透過UEFI設定來配置啟動順序。

5.TSL(作業系統載入前期):這個階段涉及載入作業系統引導載入器,準備作業系統載入。UEFI啟動管理器在這個階段起到關鍵作用。

6.RT(系統執行時):一旦作業系統載入完成,系統進入執行時階段。UEFI仍然提供了一些執行時服務,使作業系統能夠訪問硬體資源。

7. AL(系統災難恢復期或關機):這是系統的最終階段,涉及系統的災難恢復、關機或重啟。

(三)各種啟動的區別

(1)嵌入式系統與個人計算機啟動的區別

嵌入式裝置與個人計算機系統,在啟動方面,個人認為最大的區別是個人計算機將嵌入式裝置系統SOC中大部分的功能放到BIOS上去實現了。主要的原因是嵌入式裝置的SOC的外設介面和器件相對比較固定,沒有個人PC機的主機板這麼複雜,所以放在SOC的ROM上去實現會更加的高效。

我們可以從硬體平臺、載入程式、啟動時間上做簡單介紹

1. 硬體平臺:

  • 嵌入式系統通常設計用於特定用途,硬體資源相對較少,例如智慧家居裝置、工業控制系統或電子裝置。因此,它們的啟動過程通常是針對特定硬體的定製化。
  • 個人計算機電腦是通用計算裝置,硬體配置通常更為複雜和強大,例如桌面電腦、膝上型電腦或平板電腦。

2. 引導載入程式:

  • 在個人計算機上,通常使用一個引導載入程式(bootloader)來啟動作業系統。這個引導載入程式會載入並執行作業系統的核心,例如Windows的NT Loader或者GNU GRUB。
  • 在嵌入式系統中,可能會使用不同的引導載入機制,例如簡單的啟動載入器(Simple Boot Loader)或直接由硬體啟動,如晶片上的韌體。

3. 啟動時間:

  • 由於個人計算機通常具有更復雜的啟動過程,包括硬體自檢(POST)、引導載入程式和作業系統載入等步驟,因此它們的啟動時間可能會相對較長。
  • 嵌入式系統通常更注重啟動速度和即時響應性,因此它們的啟動時間通常更短。

整體來說:嵌入式系統更加註重定製化和高效性,而個人計算機則更注重通用性和功能性。

(2)LEGACY(BIOS) 與 UEFI 啟動的區別

它們主要的區別在於啟動方式、啟動速度、容量限制、圖形介面、安全性上

1.啟動方式:

  • Legacy BIOS是傳統的啟動方式,它使用基本輸入/輸出系統來啟動計算機。在這種方式下,計算機會首先執行BIOS韌體中儲存的啟動程式,然後載入作業系統。
  • UEFI是一種新一代的啟動方式,它取代了傳統的BIOS。UEFI提供了更加靈活和強大的啟動環境,支援更多的硬體特性和功能。UEFI啟動過程中,計算機會執行儲存在UEFI韌體中的啟動程式,並且可以載入作業系統和引導載入程式。

2. 啟動速度:

  • UEFI啟動通常比Legacy BIOS啟動更快,因為UEFI韌體在啟動過程中能夠更有效地初始化硬體和執行啟動程式。
  • Legacy BIOS啟動可能會比較慢,因為它是基於較老的技術,並且在初始化硬體和執行啟動程式時可能需要更多的時間。

3. 容量限制:

  • Legacy BIOS有一些容量限制,例如對於硬碟分割槽的大小或啟動介質的容量有限制。
  • UEFI則更加靈活,支援更大容量的硬碟分割槽和啟動介質,因此能夠更好地適應現代計算機系統的需求。

4. 圖形介面:

  • UEFI通常支援圖形介面,可以提供更友好的使用者互動體驗,例如在啟動時顯示啟動選單或設定介面。
  • Legacy BIOS通常是基於文字介面的,使用者互動相對簡單,一般透過鍵盤輸入來進行選擇和設定。

5. 安全性:

  • UEFI提供了更多的安全功能,例如Secure Boot,可以幫助防止惡意軟體在系統啟動時載入。
  • Legacy BIOS相對較為簡單,安全功能較少,容易受到惡意軟體的攻擊。

總的來說,UEFI相比Legacy BIOS具有更快的啟動速度、更大的容量支援、更豐富的功能和更好的安全性,因此在現代計算機系統中越來越受到廣泛應用。

結尾

以前在嵌入式軟體開發崗位面試的時候,經常被問到系統啟動流程,或者是uboot啟動流程介紹。對於系統工程師而言,這些應該是需要熟練掌握,但是對於應用工程師而言,我個人認為只要瞭解基本流程和概念就可以了。

以上內容,如有錯誤,歡迎批評指正

---------------------------End---------------------------
如需獲取更多內容
請關注 liwen01 公眾號

相關文章