對(duì)于計(jì)算機(jī)系統(tǒng)來(lái)說(shuō),從開(kāi)機(jī)上電到操作系統(tǒng)啟動(dòng)需要一個(gè)引導(dǎo)過(guò)程。嵌入式Linux系統(tǒng)同樣離不開(kāi)引導(dǎo)程序,這個(gè)引導(dǎo)程序就叫作Bootloader。在這里我們就為大家詳細(xì)介紹Bootloader,Bootloader是在操作系統(tǒng)運(yùn)行之前執(zhí)行的一段小程序。通過(guò)這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映射表,從而建立適當(dāng)?shù)南到y(tǒng)軟硬件環(huán)境,為最終調(diào)用操作系統(tǒng)內(nèi)核做好準(zhǔ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的源程序。
反過(guò)來(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)接口。
本章將對(duì)各種Bootloader總結(jié)分類,分析它們的共同特點(diǎn)。以U-Boot為例,詳細(xì)討論Bootloader的設(shè)計(jì)與實(shí)現(xiàn)。
Bootloader的啟動(dòng)
Linux系統(tǒng)是通過(guò)Bootloader引導(dǎo)啟動(dòng)的。一上電,就要執(zhí)行Bootloader來(lái)初始化系統(tǒng)??梢酝ㄟ^(guò)第4章的Linux啟動(dòng)過(guò)程框圖回顧一下。
系統(tǒng)加電或復(fù)位后,所有CPU都會(huì)從某個(gè)地址開(kāi)始執(zhí)行,這是由處理器設(shè)計(jì)決定的。比如,X86的復(fù)位向量在高地址端,ARM處理器在復(fù)位時(shí)從地址0x00000000取第一條指令。嵌入式系統(tǒng)的開(kāi)發(fā)板都要把板上ROM或Flash映射到這個(gè)地址。因此,必須把Bootloader程序存儲(chǔ)在相應(yīng)的Flash位置。系統(tǒng)加電后,CPU將首先執(zhí)行它。
主機(jī)和目標(biāo)機(jī)之間一般有串口可以連接,Bootloader軟件通常會(huì)通過(guò)串口來(lái)輸入輸出。例如:輸出出錯(cuò)或者執(zhí)行結(jié)果信息到串口終端,從串口終端讀取用戶控制命令等。
Bootloader啟動(dòng)過(guò)程通常是多階段的,這樣既能提供復(fù)雜的功能,又有很好的可移植性。例如:從Flash啟動(dòng)的Bootloader多數(shù)是兩階段的啟動(dòng)過(guò)程。從后面U-Boot的內(nèi)容可以詳細(xì)分析這個(gè)特性。
大多數(shù)Bootloader都包含2種不同的操作模式:本地加載模式和遠(yuǎn)程下載模式。這2種操作模式的區(qū)別僅對(duì)于開(kāi)發(fā)人員才有意義,也就是不同啟動(dòng)方式的使用。從最終用戶的角度看,Bootloader的作用就是用來(lái)加載操作系統(tǒng),而并不存在所謂的本地加載模式與遠(yuǎn)程下載模式的區(qū)別。
評(píng)論