liwen01 2024.04.14
前言
我們身邊的各種電子裝置,手機、手錶、相機、個人電腦等等,從使用者體驗的角度看,好像只要給它們一上電,它們就開始啟動可以工作了,這個過程一般是比較短暫的。
從一個嵌入式開發的角度來看,不管是嵌入式系統,還是其它的計算機系統,其啟動過程都是一個相對複雜的過程。這個過程一旦出錯,基本上裝置就不能正常執行了。
(一)嵌入式系統啟動
(1)儲存架構示意圖
我們先看一個嵌入式系統的儲存架構示意圖
嵌入式裝置的儲存介質一般有NOR Flash
,NAND Flash
、SD卡
、EEPROM
等,其中根據Flash介面的不同,又可以分期序列Flash(SPI Flash)
和並行Flash
。在晶片內部有它們對應的控制器。
於此同時,一般在晶片的內部,都會有一個比較小的SRAM和ROM,我們一般稱它為內部SRAM和內部ROM。
我們的程式,包括系統程式和應用程式,一般都是存放在這些外接的儲存介質上。
(2)啟動過程
-
晶片上電執行的第一條程式,不是執行放置在外部Flash中的Boot程式,執行的是內部ROM上的程式 -
內部ROM裡面的程式,會根據BOOT_SEL引腳的電平狀態,判斷需要從哪個儲存器中啟動,然後初始化該儲存器的介面 -
儲存器介面初始化完成後,將儲存裝置最開始的一小段程式程式(一般4~5K)載入到內部SRAM,透過這一小部分程式去初始化外部的DDR記憶體 -
外部DDR初始化完之後,再將Flash中剩下的程式碼複製到外部DDR中,然後再跳轉到外部DDR中去執行BOOT剩下的程式碼 -
DDR上的BOOT程式會去初始化硬體並引導kernel的啟動,隨後kernel去掛載根檔案系統 -
根檔案系統去執行應用程式、並掛載在儲存器上其它分割槽上的檔案系統
這裡需要對幾個知識點需要注意:
-
並不是所有的系統都有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的主要功能有:
-
電源管理 -
溫度監測和風扇控制 -
輸入裝置管理 -
系統監控與故障檢測 -
啟動時序管理 -
電池管理(適用於膝上型電腦)
(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系統中大概的一個啟動流程是:
-
計算機上電 -
BIOS自檢 -
UEFI韌體啟動 -
根據RAM中儲存的啟動順序載入啟動裝置 -
判斷啟動裝置中是否存在ESP分割槽,如果有則載入,沒有則下一個儲存器中查詢 -
讀取ESP分割槽中的EFI應用資訊,載入到BCD檔案 -
讀取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啟動流程介紹。對於系統工程師而言,這些應該是需要熟練掌握,但是對於應用工程師而言,我個人認為只要瞭解基本流程和概念就可以了。
以上內容,如有錯誤,歡迎批評指正