乙個嵌入式 linux 系統從軟體角度看可以分為四個部分:引導引導程式(bootloader), linux 核心,檔案系統,應用程式。
當系統首次引導時,或系統被重置時,處理器會執行乙個位於flash/rom中的已知位置處的**,bootloader就是這第一段**。它主要用來初始化處理器及外設,然後呼叫 linux 核心。linux 核心在完成系統的初始化之後需要掛載某個檔案系統作為根檔案系統(root filesystem),然後載入必要的核心模組,啟動應用程式。這就是嵌入式linux系統啟動過程 linux 引導的整個過程。
根檔案系統是 linux 系統的核心組成部分,它可以作為linux 系統中檔案和資料的儲存區域,通常它還包括系統配置檔案和執行應用軟體所需要的庫。應用程式可以說是嵌入式系統的「靈魂」,它所實現的功能通常就是設計該嵌入式系統所要達到的目標。如果沒有應用程式的支援,任何硬體上設計精良的嵌入式系統都沒有實用意義。
從以上分析可以看出 bootloader在執行過程中雖然具有初始化系統和執行使用者輸入的命令等作用,但它最根本的功能就是為了啟動 linux 核心,讓我們進一步分析 bootloader 和 linux 核心在嵌入式系統中的關係和作用。
bootloader
1、bootloader基本概述
bootloader是嵌入式系統的引導引導程式,它是系統上電後執行的第一段程式,其作用類似於 pc 機上的 bios。bootloader是依賴於硬體而實現的,特別是在嵌入式領域,為嵌入式系統建立乙個通用的bootloader是很困難的,但為了能達到啟動linux 核心的目的,所有的 bootloader都必須具備以下功能:
1) 初始化 ram
因為 linux 核心一般都會在 ram 中執行,所以在呼叫 linux 核心之前 bootloader 必須設定和初始化 ram,為呼叫 linux核心做好準備。初始化 ram 的任務包括設定 cpu 的控制暫存器引數,以便能正常使用 ram 以及檢測ram 大小等。
2) 初始化串列埠埠
在 linux 的啟動過程中有著非常重要的作用,它是 linux核心和使用者互動的方式之一。linux 在啟動過程中可以將資訊通過串列埠輸出,這樣便可清楚的了解 linux 的啟動過程。雖然它並不是 bootloader 必須要完成的工作,但是通過串列埠輸出資訊是除錯 bootloader 和linux 核心的強有力的工具,所以一般的 bootloader 都會在執行過程中初始化乙個串列埠作為除錯埠。
3) 檢測處理器型別
bootloader在呼叫 linux核心前必須檢測系統的處理器型別,並將其儲存到某個常量中提供給 linux 核心。linux 核心在啟動過程中會根據該處理器型別呼叫相應的初始化程式。
4) 設定 linux啟動引數
bootloader在執行過程中必須設定和初始化 linux 的核心啟動引數。
5) 呼叫 linux核心映像
bootloader完成的最後一項工作便是呼叫 linux核心。如果 linux 核心存放在 flash 中,並且可直接在上面執行(這裡的 flash 指 nor flash),那麼可直接跳轉到核心中去執行。但由於在 flash 中執行**會有種種限制,而且速度也遠不及 ram 快,所以一般的嵌入式系統都是將 linux核心拷貝到 ram 中,然後跳轉到 ram 中去執行。
2、bootloader啟動過程
嵌入式linux系統通過bootloader引導,一上電,就要執行bootloader來初始化系統。在完成對系統的初始化任務之後,它會將非易失性儲存器(通常是 flash或 doc 等)中的linux 核心拷貝到 ram 中去,然後跳轉到核心的第一條指令處繼續執行,從而啟動 linux 核心。bootloader 和 linux 核心有著密不可分的聯絡。
bootloader多數有兩個階段的啟動過程:
stage1:
stage2:
嵌入式系統中廣泛採用的非易失性儲存器通常是 flash,而 bootloader就位於該儲存器的最前端,所以系統上電或復位後執行的第一段程式便是 bootloader。bootloader在flash中的儲存示意圖如下:
bootloader啟動流程圖
3、bootloader 的啟動方式
3.1網路啟動方式
3.2硬碟啟動方式
傳統的linux系統執行在台式電腦或者伺服器上,這些計算機一般都使用bios引導,並使用磁碟作為儲存介質。linux傳統上是lilo (linux loader) 引導,後來又出現了gun的軟體 (grand unified bootloader) 。 這兩種bootloader廣泛應用在x86的linux系統上。
3.3 flash啟動方式
大多數嵌入式系統上都使用flash儲存介質。flash有很多態別,包括nor flash、nand flash和其它半導體盤。它們之間的不同在於: nor flash 支援晶元內執行(xip, execute in place),這樣**可以在flash上直接執行而不必拷貝到ram中去執行。而nand flash並不支援xip,所以要想執行 nand flash 上的**,必須先將其拷貝到 ram中去,然後跳到 ram 中去執行。nor flash 使用最為普遍。bootloader一般放在flash的底端或者頂端,這需要根據處理器的復位向量來進行設定。可以配置成mtd裝置來訪問flash分割槽。
4、bootloader種類
嵌入式linux系統已經有各種各樣的bootloader,種類劃分的方法也不是唯一的,一般可以按照它所支援處理器體系結構不同進行劃分,如下表:
bootloader
mointor
描述x86
armpowerpc
lilo
否linux磁碟引導程式是否
否grub
否gnu引導的lilo替代程式是否
否loadlin
否從dos引導linux是否
否rolo
否從rom引導linux而不需要bios是否
否etherboot
否通過乙太網啟動linux引導程式是否
否linux bios
否完全替代buis的linux引導程式是否
否blob
否lart等硬體平台的引導程式否是
否u-boot
是通用引導程式是是
是redboot
是基於ecos的引導程式是是
是 常見嵌入式linux的bootloader有:blob、redboot、u-boot
linux核心的啟動過程
linux 核心有兩種映像:一種是非壓縮核心,叫 image,另一種是它的壓縮版本,叫zimage。根據核心映像的不同,linux 核心的啟動在開始階段也有所不同。zimage 是 image經過壓縮形成的,所以它的大小比 image 小。但為了能使用 zimage,必須在它的開頭加上解壓縮的**,將 zimage 解壓縮之後才能執行,因此它的執行速度比 image 要慢。但考慮到嵌入式系統的儲存空容量一般比較小,採用 zimage 可以占用較少的儲存空間,因此犧牲一點效能上的代價也是值得的。所以一般的嵌入式系統均採用壓縮核心的方式。
在 bootloader將 linux 核心映像拷貝到 ram 以後,解壓核心映像和初始化,完成剩餘的與硬體平台相關的初始化工作,再進行一系列與核心相關的初始化後,呼叫第乙個使用者程序-init 程序並等待使用者程序的執行,這樣整個 linux 核心便啟動完畢。在很多情況下,我們可以呼叫乙個簡單的 shell 指令碼來啟動必需的嵌入式應用程式。
嵌入式系統啟動過程
1.rom code.上電首先執行rom中的 rom code的目的是把第二部分boot code spl second stage program loader load 到 sram中。rom code執行時,屬於最小系統,ddr還沒有初始化,可以使用的ram 只有晶元中的sram。而sram的...
嵌入式開發手記(一)嵌入式系統啟動過程
s5pv210啟動詳解 soc詳解。2.bl1,bl2 為 bootloder1,bootloder 2.1 1 cpu 上電後先從內部 irom 類似sram 中讀取預先設定的 bl0 執行。這一段 irom 首先做了一些基本的初始化 cpu時鐘 關看門狗 這一段 irom 是三星出廠前設定的,三...
嵌入式系統啟動
嵌入式系統在啟動時,引導 作業系統的執行和應用程式的載入主要有兩種架構,一種是直接從nor flash啟動的架構,另一種是直接從nand flash啟動的架構。1.從nor flash啟動 nor flash具有晶元內執行 xip,execute in place 的特點,在嵌入式系統中常做為存放啟...