/ 引言 /
Bootloader是嵌入式系統(tǒng)在加電后執(zhí)行的第一段代碼,在它完成CPU和相關(guān)硬件的初始化之后,再將操作系統(tǒng)映像或固化的嵌入式應(yīng)用程序裝在到內(nèi)存中然后跳轉(zhuǎn)到操作系統(tǒng)所在的空間,啟動(dòng)操作系統(tǒng)運(yùn)行。
對(duì)于嵌入式系統(tǒng),Bootloader是基于特定硬件平臺(tái)來(lái)實(shí)現(xiàn)的。因此,幾乎不可能為所有的嵌入式系統(tǒng)建立一個(gè)通用的Bootloader,不同的處理器架構(gòu)都有不同的Bootloader。Bootloader不但依賴于CPU的體系結(jié)構(gòu),而且依賴于嵌入式系統(tǒng)板級(jí)設(shè)備的配置。對(duì)于2塊不同的嵌入式板而言,即使它們使用同一種處理器,要想讓運(yùn)行在一塊板子上的Bootloader程序也能運(yùn)行在另一塊板子上,一般也都需要修改Bootloader的源程序。
反過來(lái),大部分Bootloader仍然具有很多共性,某些Bootloader也能夠支持多種體系結(jié)構(gòu)的嵌入式系統(tǒng)。例如,U-Boot就同時(shí)支持PowerPC、ARM、MIPS和X86等體系結(jié)構(gòu),支持的板子有上百種。通常,它們都能夠自動(dòng)從存儲(chǔ)介質(zhì)上啟動(dòng),都能夠引導(dǎo)操作系統(tǒng)啟動(dòng),并且大部分都可以支持串口和以太網(wǎng)接口。
/ 簡(jiǎn)介 /
通常,BootLoader是嚴(yán)重地依賴于硬件而實(shí)現(xiàn)的,特別是在嵌入式平臺(tái)。因此,在嵌入式平臺(tái)里建立一個(gè)通用的BootLoader幾乎是不可能的。盡管如此,我們?nèi)匀豢梢詫?duì)bootloader歸納出一些通用的概念來(lái),以指導(dǎo)用戶特定的BootLoader設(shè)計(jì)與實(shí)現(xiàn)。
在專用的嵌入式板子運(yùn)行GNU/Linux系統(tǒng)已經(jīng)變得越來(lái)越流行。一個(gè)嵌入式Linux系統(tǒng)從軟件的角度看通常可以分為四個(gè)層次:
1、 引導(dǎo)加載程序 。包括固化在固件(firmware)中的boot代碼(可選),和BootLoader兩大部分。
2、Linux內(nèi)核 。特定于嵌入式板子的定制內(nèi)核以及內(nèi)核的啟動(dòng)參數(shù)。
3、 文件系統(tǒng) 。包括根文件系統(tǒng)和建立于Flash內(nèi)存設(shè)備之上文件系統(tǒng)。通常用ramdisk來(lái)作為rootfs。
4、 用戶應(yīng)用程序 。特定于用戶的應(yīng)用程序。有時(shí)在用戶應(yīng)用程序和內(nèi)核層之間可能還會(huì)包括一個(gè)嵌入式圖形用戶界面。常用的嵌入式GUI有:MicroWindows和MiniGUI等。
/ 操作模式 /
大多數(shù)Bootloader都包含兩種不同的操作模式:
(1)啟動(dòng)加載模式
在這種模式下,Bootloader從目標(biāo)機(jī)的某個(gè)固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行,整個(gè)過程并沒有用戶的介入。這種模式是Bootloader的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布時(shí),Bootloader必須工作在這種模式下。
(2)下載模式
在這種模式下,目標(biāo)機(jī)上的Bootloader將通過串口或網(wǎng)絡(luò)等通信手段從開發(fā)主機(jī)(Host)上下載內(nèi)核映像和根文件系統(tǒng)映像等到RAM中,然后可再被Bootloader寫到目標(biāo)機(jī)上的固態(tài)存儲(chǔ)媒質(zhì)中,或者直接進(jìn)行系統(tǒng)的引導(dǎo)。
啟動(dòng)加載模式通常用于第一次燒寫內(nèi)核與根文件系統(tǒng)到固態(tài)存儲(chǔ)媒質(zhì)時(shí)或者以后的系統(tǒng)更新時(shí)使用;下載模式多用于開發(fā)人員在前期開發(fā)的過程中,工作于這種模式下的Bootloader通常都會(huì)向它的終端用戶提供一個(gè)簡(jiǎn)單的命令行接口。
/ 啟動(dòng)過程 /
Bootloader啟動(dòng)大多數(shù)都分為兩個(gè)階段。第一階段主要包含依賴于CPU的體系結(jié)構(gòu)硬件初始化的代碼,通常都用匯編語(yǔ)言來(lái)實(shí)現(xiàn)。這個(gè)階段的任務(wù)有:
基本的硬件設(shè)備初始化(屏蔽所有的中斷、關(guān)閉處理器內(nèi)部指令/數(shù)據(jù)Cache等)。
為第二階段準(zhǔn)備RAM空間。
如果是從某個(gè)固態(tài)存儲(chǔ)媒質(zhì)中,則復(fù)制Bootloader的第二階段代碼到RAM 。
設(shè)置堆棧。
在第一階段中為什么要關(guān)閉Cache?通常使用Cache以及寫緩沖是為了提高系統(tǒng)性能,但由于Cache的使用可能改變?cè)L問主存的數(shù)量、類型和時(shí)間,因此Bootloader通常是不需要的。
跳轉(zhuǎn)到第二階段的C程序入口點(diǎn)。
第二階段通常用C語(yǔ)言完成,以便實(shí)現(xiàn)更復(fù)雜的功能,也使程序有更好的可讀性和可移植性。這個(gè)階段的任務(wù)有:
初始化本階段要使用到的硬件設(shè)備。
檢測(cè)系統(tǒng)內(nèi)存映射。
將內(nèi)核映像和根文件系統(tǒng)映像從Flash讀到RAM。
為內(nèi)核設(shè)置啟動(dòng)參數(shù)。
調(diào)用內(nèi)核
-
處理器
+關(guān)注
關(guān)注
68文章
19170瀏覽量
229187 -
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3569瀏覽量
129247 -
bootloader
+關(guān)注
關(guān)注
2文章
234瀏覽量
45555 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
316瀏覽量
21619 -
以太網(wǎng)接口
+關(guān)注
關(guān)注
0文章
147瀏覽量
17067
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論