啟動嵌入式系統︰
開機引導程式(Boot Loader)導論

1. 概論 

所謂開機引導程式(Boot Loader)就是當嵌入式系統硬體開機或是重設(Reset)之後所要執行的第一段軟體的程式碼。相對應於我們日常生活最常接觸的個人電腦,其Boot Loader就是由BIOS和硬碟的主要開機磁區中的OS Loader(例如:LILO或是GRUB)所組成;BIOS在完成硬體元件的檢測,初始化以及設定之後,將硬碟的主要開機磁區的OS Loader搬移到系統的記憶體,然後將系統控制權交給它。在嵌入式系統中,Boot Loader的主要任務就是將系統核心搬移到系統的記憶體,可能需要傳入適當的參數給核心,這些參數可以來自開機命令行或儲存裝置,然後跳到核心的入口點 執行,開始啟動作業系統;有些Boot Loader還扮演開機選單的角色,可以讓使用者選擇不同的作業系統開機,此類程式則有時稱為開機管理程式(boot manager)。

每個目標板啟動Linux的程序都類似,在個人電腦平台,Linux本身包含微處理器的初始程式碼,這個初始程式碼會設定微處理器的暫存器進入保 護狀態(protected-mode),並引發kernel裡一個稱為start_kernel的進入點.從啟動電源到出現shell提示符號的過程, 可以歸類為以下的步驟:

1)處理器經重設(Reset)或電源開啟之後,即開始執行唯讀記憶體中的基本設定程式,此類程式類似個人電腦的BIOS。此基本設定程式碼會針 對中央處理器,記憶體控制單元,單晶片裝置進行初始化動作,也會設定記憶體對應(Memory Map),接著會執行Boot Loader程式。

2)Boot Loader會將Linux Kernel從非揮發性記憶體(如快閃記憶體)或是外部儲存裝置解壓縮到動態記憶體裡面去,然後會跳到核心的第一個指令去執行。核心首先會設定處理器的暫 存器,初始化核心資料結構,偵測硬體,啟動驅動程式,這一部份是與硬體有關的初始化。

3)接著跳至start_kernel執行,這是一個與硬體架構無關的起始點,核心此時會初始化核心的子系統,例如快取區,緩衝區,還有程序間通 信(IPC),解譯核心的參數,開啟中斷(enable interrupt),計算系統的BogoMips作為延遲機制,接著初始化需要利用延遲機制的的子系統。

4)此時核心會產生init作為核心的一個執行緒(kernel thread),此期間做的主要一件事就是執行do_basic_setup,開始設定執行環境,和檔案系統。

5)接著便會掛載(mount)root檔案系統,掛載檔案系統的程序也可以包括先掛載initrd,此即建構在RAM 上面的暫時root檔案系統,如在無真實儲存裝置的嵌入式系統,initrd可以當作系統運作的root檔案系統。

6)核心執行緒init接著會產生一個使用者空間的init程序(process),載入共享的執行時期函式庫,如有記憶管理單元硬體的系統中,系統在會在這個階段啟動它。

7)接著使用者空間的init程序會讀取它的設定檔,並執行一個啟動script,用以設定並啟動網路以及其他系統裝置,最後init進入runlevel階段,此時系統的各項服務才算是要開始運作,可開始登錄(login)作業。

2.開機程式基本原理
在嵌入式系統的世界中,Boot Loader的實作與系統硬體息息相關,因此,要為所有的嵌入式裝置建立一個通用的Boot Loader幾乎可以說是不可能的,但我們仍然可以針對Boot Loader歸納一些一般的概念,來說明其基本原理。

1)與中央處理器以及電路板的關係 針對不同的中央處理器構造都會有相對應的Boot Loader,有些Boot Loader也會支援一系列的中央處理器,例如Das U-Boot以及RedBoot等。此外,Boot Loader也會隨著電路板上的裝置而有所不同。

2)安裝媒介 系統啟動或是重設(Reset)之後,中央處理器會到某個中央處理器製造商所預定的位置載入第一個執行的指令。而嵌入式系統中通常都會有某種的非揮發性儲存裝置(例如快閃記憶體或是唯讀記憶體)對應到這個預先設定的位置。

3)操作模式 大多數的Boot Loader都會有兩種操作模式,分述如下:

啟動載入(Boot Loading)模式: Boot Loader將儲存在電路板上的某個非揮發性儲存裝置的作業系統環境直接載入記憶體執行,而不需要使用者的介入。當嵌入式系統產品化之後,只會執行這個模式。

下載模式(Downloading)模式: 在這個模式下,Boot Loader啟動後,可以接受使用者的命令,透過某些輸出輸入通道(例如序列埠或是乙太網路),更新嵌入式裝置中的映像檔。此模式通常只會在產品開發過程中供研發人員使用。

3.嵌入式系統常用的Boot Loader
•U-Boot "Universal Boot loader",專供以PowerPC和ARM核心為基礎的嵌入式系統所用的Boot loader。 •RedBoot︰由紅帽公司(RedHat)的 eCos 所延伸出來的,可攜性極高的嵌入式系統Boot Loader)。
•Blob︰LART所用的Boot loader,所謂LART就是Linux Advanced Radio Terminal的縮寫,意指小型但計算能力很強可以讓Linux作業系統在上面運作的嵌入式電腦。
•rrload︰專供以ARM核心為基礎的嵌入式系統所用的Boot loader。
•FILO︰與x86架構相容的Boot Loader,他可以在沒有BIOS的狀況下直接由本地端的檔案系統載入開機映像檔。
•CRL/OHH︰在快閃記憶體上專供以ARM核心為基礎的嵌入式系統所用的Boot loader。
•PPCBOOT︰專供以PowerPC核心為基礎的嵌入式系統所用的Boot loader。
•Alios︰能夠由唯讀記憶體或是動態記憶體完成基本的硬體初始化動作,以組合語言完成的Linux Loader,其設計目標在於免除在嵌入式系統中對於韌體BIOS的需求。 從上面的簡介,可看出Boot Loader的主要功能模組,我們可以將Boot Loader分割成三個區塊,分述如下:

1) 主要功能模組︰在這個模組中,主要任務如下:
•初始化中央處理器並設定時脈
•設定系統不處理任何中斷
•設定堆疊空間
•啟動電源管理功能
•載入嵌入式系統軟體元件並且執行
•可以讀寫資料到系統的非揮發性記憶體以支援下載模式

2) 輸出輸入通道驅動模組︰在這個模組中,主要任務如下:
•初始化輸出輸入裝置,例如序列埠或是乙太網路
•提供可以讓Host電腦與目標板互相傳輸資料的介面

3) 記憶裝置驅動模組︰在這個模組中,主要任務如下:
•初始化儲存裝置並且設定儲存裝置控製器中的暫存器
•設定記憶體分頁大小,記憶體大小以及其他記憶體管理相關的暫存器,如果需要的話,啟動記憶體管理單元。

4. 結語 本文介紹了嵌入式系統開機引導程式的功能,以及常用的程式,以後有機會將繼續介紹這些開機引導程式的用法及其比較。

arrow
arrow
    全站熱搜

    Bluelove1968 發表在 痞客邦 留言(0) 人氣()