對(duì)于嵌入式Linux系統(tǒng)來(lái)說(shuō),從開(kāi)機(jī)上電到操作系統(tǒng)啟動(dòng)需要一個(gè)引導(dǎo)過(guò)程,引導(dǎo)過(guò)程體現(xiàn)在引導(dǎo)程序上,而這個(gè)引導(dǎo)程序就叫作Bootloader。 Bootloader的概念與作用Bootloader 是嵌入式系統(tǒng)的引導(dǎo)加載程序,它是系統(tǒng)上電后運(yùn)行(操作系統(tǒng)運(yùn)行之前)的第一段程序 。通過(guò)這段程序可以初始化硬件設(shè)備、建立內(nèi)存空間的映射表,從而建立系統(tǒng)的軟硬件環(huán)境,為最終調(diào)用Linux操作系統(tǒng)內(nèi)核做好準(zhǔn)備。在完成對(duì)系統(tǒng)的初始化任務(wù)之后,它會(huì)將非易失性存儲(chǔ)器(通常是Flash)中的內(nèi)核拷貝到RAM中去,然后跳轉(zhuǎn)到內(nèi)核的第一條指令處繼續(xù)執(zhí)行,從而啟動(dòng)Linux內(nèi)核。另外,幾乎不可能為所有的嵌入式系統(tǒng)建立一個(gè)通用的Bootloader,不同的處理器架構(gòu)都有不同的Bootloader,Bootloader不但依賴(lài)于CPU的體系結(jié)構(gòu),而且依賴(lài)于嵌入式系統(tǒng)板級(jí)設(shè)備的配置。 Bootloader的種類(lèi)現(xiàn)在已經(jīng)有各種各樣的Bootloader,種類(lèi)劃分也有多種方式。下面就來(lái)看一下常用的引導(dǎo)加載程序: ROLO:從ROM引導(dǎo)Linux而不需要BIOS,支持X86架構(gòu),不支持ARM和PowerPC; Etherboot:通過(guò)以太網(wǎng)卡啟動(dòng)Linux系統(tǒng)的固件,支持X86架構(gòu),不支持ARM和PowerPC; U-boot:通用引導(dǎo)加載程序,支持X86架構(gòu),并支持ARM和PowerPC; RedBoot:基于eCos的引導(dǎo)加載程序,支持X86架構(gòu),并支持ARM和PowerPC; 值得指出的是Redboot,它幾乎能夠支持所有的體系結(jié)構(gòu),包括MIPS、SH、M68K等體系結(jié)構(gòu)。Redboot是以eCos為基礎(chǔ),采用GPL許可的開(kāi)源軟件工程。 Bootloader的啟動(dòng)流程Bootloader的實(shí)現(xiàn)依賴(lài)于CPU的體系結(jié)構(gòu),因此大多數(shù)的bootloader一般都是分為兩個(gè)階段的,第一個(gè)階段使用匯編來(lái)實(shí)現(xiàn),它完成一些依賴(lài)于CPU體系結(jié)構(gòu)的初始化,并調(diào)用第二階段的代碼;第二階段則通常使用C語(yǔ)言來(lái)實(shí)現(xiàn),這樣可以實(shí)現(xiàn)更復(fù)雜的功能,而且代碼會(huì)有更好的可讀性和移植性。 Bootloader的第一階段 主要包含以下步驟: 1、一些基本的硬件初始化工作 :主要設(shè)置CPU的速度和時(shí)鐘頻率、屏蔽所有中斷和清除指令與數(shù)據(jù)緩存 2、準(zhǔn)備RAM空間:所謂準(zhǔn)備RAM空間,就是初始化內(nèi)存芯片,使它可被用 3、設(shè)置好堆棧:設(shè)置堆棧指針是為執(zhí)行C語(yǔ)言代碼做準(zhǔn)備,棧的設(shè)置靈活性很大,只要讓sp寄存器指向一段沒(méi)有使用的內(nèi)存即可 4、跳轉(zhuǎn)到第二階段的C入口點(diǎn):在ARM中,通過(guò)修改PC寄存器為相應(yīng)的地址來(lái)實(shí)現(xiàn) Bootloader的第二階段 主要包含以下步驟: 1、初始化本階段要使用到的硬件設(shè)備:最重要的是設(shè)置系統(tǒng)時(shí)鐘和初始化串口 2、檢查系統(tǒng)內(nèi)存映射 3、將內(nèi)核映像和根文件系統(tǒng)從Flash上讀到RAM空間中:對(duì)于內(nèi)核映像,一般將其拷貝到從0x30008000這個(gè)基地址開(kāi)始的大約1MB大小的內(nèi)存范圍內(nèi)(嵌入式 Linux 的內(nèi)核一般都不操過(guò) 1MB),在這一區(qū)域前空出來(lái)的32KB內(nèi)存是為了放置一些全局?jǐn)?shù)據(jù)結(jié)構(gòu) 4、為內(nèi)核設(shè)置啟動(dòng)參數(shù) 5、調(diào)用內(nèi)核:BootLoader調(diào)用Linux內(nèi)核的方法是直接跳轉(zhuǎn)到內(nèi)核的第 一條指令處,在跳轉(zhuǎn)時(shí),下列條件要滿(mǎn)足: CPU 寄存器的設(shè)置: R0=0; R1=機(jī)器類(lèi)型 ID; R2=啟動(dòng)參數(shù)標(biāo)記列表在 RAM 中 起始基地址; CPU模式: 必須禁止中斷;CPU必須為SVC模式; Cache 和 MMU 的設(shè)置: MMU 必須關(guān)閉; 指令 Cache 可以打開(kāi)也可以關(guān)閉; 數(shù)據(jù) Cache 必須關(guān)閉 結(jié)語(yǔ)嵌入式系統(tǒng)的開(kāi)發(fā)過(guò)程除了涉及軟件和硬件,同時(shí)還需要結(jié)合上層應(yīng)用綜合考慮,而其中成本約束又是最關(guān)鍵的因素之一,嵌入式系統(tǒng)的硬件平臺(tái)通常是根據(jù)應(yīng)用量身定制,通常所用的MPU、存儲(chǔ)器、外圍設(shè)備等有多種選擇余地,使系統(tǒng)的引導(dǎo)加載設(shè)計(jì)變得十分復(fù)雜,如果我們從零開(kāi)始實(shí)現(xiàn)的話(huà)是非常困難且低效率的,正確的做法應(yīng)該是從相關(guān)的例程中尋找與硬件平臺(tái)最接近的作為參考程序,然后根據(jù)硬件平臺(tái)作相應(yīng)的修改。 |
|
來(lái)自: 啟云_9137 > 《計(jì)算機(jī)及軟件應(yīng)用》