內嵌式系統 Boot Loader 技術(Linux主機伺服器架設技術)
內嵌式系統 Boot Loader 技術(Linux主機伺服器架設技術)
在私人的內嵌式板子運行 GNU/Linux 系統已經變得越來越流行。
一個內嵌式 Linux 系統從軟體的角度看通常可以分為四個層次:
1. 引導加載程式。內含固化在韌體(firmware)中的 boot 代碼(可選),和 Boot Loader 兩大部分。
2. Linux 內核。特定於內嵌式板子的定制內核以及內核的啟動參數。
3. 檔案系統。內含根檔案系統和建立於 Flash 記憶體裝置之上檔案系統。通常用 ram disk 來作為 root fs。
4. 使用者應用程式。特定於使用者的應用程式。有時在使用者應用程式和內核層之間可能還會內含一個內嵌式圖形使用者介面。常用的內嵌式 GUI 有:MicroWindows 和 MiniGUI 懂。
引導加載程式是系統加電後運行的第一段軟體代碼。回憶一下 PC 的體系結構我們可以知道,PC 機中的引導加載程式由 BIOS(其本質就是一段韌體程式)和位於硬碟 MBR 中的 OS Boot Loader(比如,LILO 和 GRUB 等)一起組成。BIOS 在完成硬體檢驗和資源配置後,將硬碟 MBR 中的 Boot Loader 讀到系統的 RAM 中,然後將控制權交給 OS Boot Loader。Boot Loader 的主要運行任務就是將內核映像從硬碟上讀到 RAM 中,然後跳轉到內核的入口點去運行,也即開始啟動操作系統。
而在內嵌式系統中,通常並沒有像 BIOS 那樣的韌體程式(注,有的內嵌式 CPU 也會內嵌一段短小的啟動程式),因此整個系統的加載啟動任務就完全由 Boot Loader 來完成。比如在一個基於 ARM7TDMI core 的內嵌式系統中,系統在上電或復位時通常都從位址 0x00000000 處開始執行,而在這個位址處安排的通常就是系統的 Boot Loader 程式。
本文將從 Boot Loader 的概念、Boot Loader 的主要任務、Boot Loader 的框架結構以及 Boot Loader 的安裝等四個方面來討論內嵌式系統的 Boot Loader。
2. Boot Loader 的概念
簡單地說,Boot Loader 就是在操作系統內核運行之前運行的一段小程式。通過這段小程式,我們可以起始化硬體裝置、建立記憶體空間的映射圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終呼叫操作系統內核準備好正確的環境。
通常,Boot Loader 是嚴重地依賴於硬體而實現的,特別是在內嵌式世界。因此,在內嵌式世界裡建立一個通用的 Boot Loader 幾乎是不可能的。儘管如此,我們仍然可以對 Boot Loader 歸納出一些通用的概念來,以指導使用者特定的 Boot Loader 設計與實現。
1. Boot Loader 所支援的 CPU 和內嵌式板
每種不同的 CPU 體系結構都有不同的 Boot Loader。有些 Boot Loader 也支援多種體系結構的 CPU,比如 U-Boot 就同時支援 ARM 體系結構和MIPS 體系結構。除了依賴於 CPU 的體系結構外,Boot Loader 實際上也依賴於具體的內嵌式板級裝置的配置。這也就是說,對於兩塊不同的內嵌式板而言,即使它們是基於同一種 CPU 而構建的,要想讓運行在一塊板子上的 Boot Loader 程式也能運行在另一塊板子上,通常也都需要修改 Boot Loader 的源程式。
2. Boot Loader 的安裝媒介(Installation Medium)
系統加電或復位後,所有的 CPU 通常都從某個由 CPU 製造商預先安排的位址上取指令。比如,基於 ARM7TDMI core 的 CPU 在復位時通常都從位址 0x00000000 取它的第一條指令。而基於 CPU 構建的內嵌式系統通常都有某種類型的固態存儲裝置(比如:ROM、EEPROM 或 FLASH 等)被映射到這個預先安排的位址上。因此在系統加電後,CPU 將首先執行 Boot Loader 程式。
下圖1就是一個同時裝有 Boot Loader、內核的啟動參數、內核映像和根檔案系統映像的固態存儲裝置的典型空間配置結構圖。
3. 用來控制 Boot Loader 的裝置或機制
主電腦和目的機之間一般通過串口建立連線,Boot Loader 軟體在執行時通常會通過串口來進行 I/O,比如:輸出列印訊息到串口,從串口讀取使用者控制字元等。
4. Boot Loader 的啟動過程是單階段(Single Stage)還是多階段(Multi-Stage)
通常多階段的 Boot Loader 能提供更為複雜的功能,以及更好的可移植性。從固態存儲裝置上啟動的 Boot Loader 大多都是 2 階段的啟動過程,也即啟動過程可以分為 stage 1 和 stage 2 兩部分。而至於在 stage 1 和 stage 2 具體完成哪些任務將在下面討論。
5. Boot Loader 的操作模式 (Operation Mode)
大多數 Boot Loader 都包括兩種不同的操作模式:"啟動加載"模式和"下載"模式,這種區別僅對於開發人員才有意義。但從最終使用者的角度看,Boot Loader 的作用就是用來加載操作系統,而並不存在所謂的啟動加載模式與下載工作模式的區別。
啟動加載(Boot loading)模式:這種模式也稱為"自主" (Autonomous)模式。也即 Boot Loader 從目的機上的某個固態存儲裝置上將操作系統加載到 RAM 中運行,整個過程並沒有使用者的介入。這種模式是 Boot Loader 的標準工作模式,因此在內嵌式產品發佈的時侯,Boot Loader 顯然必須工作在這種模式下。
下載(Downloading)模式:在這種模式下,目的機上的 Boot Loader 將通過串口連線或網路連線等通信手段從主電腦(Host)下載檔案,比如:下載內核映像和根檔案系統映像等。從主電腦下載的檔案通常首先被 Boot Loader 儲存到目的機的 RAM 中,然後再被 Boot Loader 寫到目的機上的FLASH 類固態存儲裝置中。Boot Loader 的這種模式通常在第一次安裝內核與根檔案系統時被使用;此外,以後的系統更新也會使用 Boot Loader 的這種工作模式。工作於這種模式下的 Boot Loader 通常都會向它的終端使用者提供一個簡單的指令行介面。