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)接口�
嵌入式系�(tǒng)世界已經(jīng)有各種各樣的Bootloader,種類劃分也有多種方式。除了按照處理器體系�(jié)�(gòu)不同劃分以外,還有功能復(fù)雜程度的不同�
首先區(qū)分一下“Bootloader”和“Monitor”的概念。嚴(yán)格來(lái)�(shuō),“Bootloader”只是引�(dǎo)�(shè)備并且執(zhí)行主程序的固�;而“Monitor”還提供了更多的命令行接�,可以�(jìn)行調(diào)�、讀�(xiě)�(nèi)�、燒�(xiě)Flash、配置環(huán)境變量等?!癕onitor”在嵌入式系�(tǒng)�(kāi)�(fā)�(guò)程中可以提供很好的調(diào)試功�,開(kāi)�(fā)完成以后,就完全�(shè)置成了一�(gè)“Bootloader�。所以,�(xí)慣上大家把它們統(tǒng)稱為Bootloader�
表列出了Linux的開(kāi)放源碼引�(dǎo)程序及其支持的體系結(jié)�(gòu)。表中給出了X86 ARM PowerPC體系�(jié)�(gòu)的常用引�(dǎo)程序,并且注明了每一種引�(dǎo)程序是不是“Monitor��
� �(kāi)放源碼的Linux 引導(dǎo)程序
�(duì)于每種體系結(jié)�(gòu),都有一系列�(kāi)放源碼Bootloader可以選用�
?�?)X86
X86的工作站和服�(wù)器上一般使用LILO和GRUB。LILO是Linux�(fā)行版主流的Bootloader。不�(guò)Redhat Linux�(fā)行版已經(jīng)使用了GRUB,GRUB比LILO有更有好的顯示界�,使用配置也更加靈活方便�
在某些X86嵌入式單板機(jī)或者特殊設(shè)備上,會(huì)采用其他Bootloader,例如:ROLO。這些Bootloader可以取代BIOS的功�,能夠從FLASH中直接引�(dǎo)Linux啟動(dòng)?,F(xiàn)在ROLO支持的開(kāi)�(fā)板已�(jīng)并入U(xiǎn)-Boot,所以U-Boot也可以支持X86平臺(tái)�
?�?)ARM
ARM處理器的芯片商很�,所以每種芯片的�(kāi)�(fā)板都有自己的Bootloader。結(jié)果ARM bootloader也變得多種多�。最早有為ARM720處理器的�(kāi)�(fā)板的固件,又有了armboot,StrongARM平臺(tái)的blob,還有S3C2410處理器開(kāi)�(fā)板上的vivi等。現(xiàn)在armboot已經(jīng)并入了U-Boot,所以U-Boot也支持ARM/XSCALE平臺(tái)。U-Boot已經(jīng)成為ARM平臺(tái)事實(shí)上的�(biāo)�(zhǔn)Bootloader�
?�?)PowerPC
PowerPC平臺(tái)的處理器有標(biāo)�(zhǔn)的Bootloader,就是ppcboot。PPCBOOT在合并armboot等之后,�(chuàng)建了U-Boot,成為各種體系結(jié)�(gòu)�(kāi)�(fā)板的通用引導(dǎo)程序。U-Boot仍然是PowerPC平臺(tái)的主要Bootloader�
?�?)MIPS
MIPS公司�(kāi)�(fā)的YAMON是標(biāo)�(zhǔn)的Bootloader,也有許多MIPS芯片商為自己的開(kāi)�(fā)板寫(xiě)了Bootloader。現(xiàn)�,U-Boot也已�(jīng)支持MIPS平臺(tái)�
�5)SH
SH平臺(tái)的標(biāo)�(zhǔn)Bootloader是sh-boot。Redboot在這種平臺(tái)上也很好��
?�?)M68K
M68K平臺(tái)�(méi)有標(biāo)�(zhǔn)的Bootloader。Redboot能夠支持m68k系列的系�(tǒng)�
值得�(shuō)明的是Redboot,它幾乎能夠支持所有的體系�(jié)�(gòu),包括MIPS、SH、M68K等體系結(jié)�(gòu)。Redboot是以eCos為基�(chǔ),采用GPL許可的開(kāi)源軟件工��
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ū)��
�?yàn)锽ootloader的主要功能是引導(dǎo)操作系統(tǒng)啟動(dòng),所以我�?cè)�?xì)討論一下各種啟�(dòng)方式的特�(diǎn)�
1.網(wǎng)�(luò)啟動(dòng)方式
這種方式�(kāi)�(fā)板不需要配置較大的存儲(chǔ)介質(zhì),跟�(wú)�(pán)工作站有�(diǎn)類似。但是使用這種啟動(dòng)方式之前,需要把Bootloader安裝到板上的EPROM或者Flash�。Bootloader通過(guò)以太�(wǎng)接口�(yuǎn)程下載Linux�(nèi)核映像或者文件系�(tǒng)。第4章介紹的交叉�(kāi)�(fā)�(huán)境就是以�(wǎng)�(luò)啟動(dòng)方式建立�。這種方式�(duì)于嵌入式系統(tǒng)�(kāi)�(fā)�(lái)�(shuō)非常重要�
使用這種方式也有前提條件,就是目�(biāo)板有串口、以太網(wǎng)接口或者其他連接方式。串口一般可以作為控制臺(tái),同�(shí)可以用來(lái)下載�(nèi)核影像和RAMDISK文件系統(tǒng)。串口通信傳輸速率�(guò)低,不適合用�(lái)掛接NFS文件系統(tǒng)。所以以太網(wǎng)接口成為通用的互連設(shè)�,一般的�(kāi)�(fā)板都可以配置10M以太�(wǎng)接口�
�(duì)于PDA等手持設(shè)備來(lái)�(shuō),以太網(wǎng)的RJ-45接口顯得大了�,而USB接口,特別是USB的迷你接�,尺寸非常小。對(duì)于開(kāi)�(fā)的嵌入式系統(tǒng),可以把USB接口虛擬成以太網(wǎng)接口�(lái)通訊。這種方式在開(kāi)�(fā)主機(jī)和開(kāi)�(fā)板兩端都需要驅(qū)�(dòng)程序�
另外,還要在服務(wù)器上配置啟動(dòng)相關(guān)�(wǎng)�(luò)服務(wù)。Bootloader下載文件一般都使用TFTP�(wǎng)�(luò)�(xié)�,還可以通過(guò)DHCP的方式動(dòng)�(tài)配置IP地址�
DHCP/BOOTP服務(wù)為Bootloader分配IP地址,配置網(wǎng)�(luò)參數(shù),然后才能夠支持�(wǎng)�(luò)傳輸功能。如果Bootloader可以直接�(shè)置網(wǎng)�(luò)參數(shù),就可以不使用DHCP�
TFTP服務(wù)為Bootloader客戶端提供文件下載功能,把內(nèi)核映像和其他文件放在/tftpboot目錄�。這樣Bootloader可以通過(guò)�(jiǎn)單的TFTP�(xié)議遠(yuǎn)程下載內(nèi)核映像到�(nèi)�。如�1所示�
�1 �(wǎng)�(luò)啟動(dòng)示意�
大部分引�(dǎo)程序都能夠支持網(wǎng)�(luò)啟動(dòng)方式。例如:BIOS的PXE(Preboot Execution Environment)功能就是網(wǎng)�(luò)啟動(dòng)方式;U-Boot也支持網(wǎng)�(luò)啟動(dòng)功能�
2.磁�(pán)啟動(dòng)方式
傳統(tǒng)的Linux系統(tǒng)�(yùn)行在�(tái)式機(jī)或者服�(wù)器上,這些�(jì)算機(jī)一般都使用BIOS引導(dǎo),并且使用磁�(pán)作為存儲(chǔ)介質(zhì)。如果�(jìn)入BIOS�(shè)置菜�,可以探�(cè)處理�、內(nèi)�、硬�(pán)等設(shè)�,可以設(shè)置BIOS從軟�(pán)、光�(pán)或者某塊硬�(pán)啟動(dòng)。也就是�(shuō),BIOS并不直接引導(dǎo)操作系統(tǒng)。那么在硬盤(pán)的主引導(dǎo)區(qū),還需要一�(gè)Bootloader。這�(gè)Bootloader可以從磁�(pán)文件系統(tǒng)中把操作系統(tǒng)引導(dǎo)起來(lái)�
Linux傳統(tǒng)上是通過(guò)LILO(LInux LOader)引�(dǎo)的,后來(lái)又出�(xiàn)了GNU的軟件GRUB(GRand Unified Bootloader�。�2種Bootloader廣泛�(yīng)用在X86的Linux系統(tǒng)�。你的開(kāi)�(fā)主機(jī)可能就使用了其中一種,熟悉它們有助于配置多種系統(tǒng)引導(dǎo)功能�
LILO軟件工程是由Werner Almesberger�(chuàng)�,專門(mén)為引�(dǎo)Linux�(kāi)�(fā)的。現(xiàn)在LILO的維�(hù)者是John Coffman,版本下載站�(diǎn)�<https://lilo.go.dyndns.org/>。LILO有詳�(xì)的文�,例如LILO套件中附帶使用手�(cè)和參考手�(cè)。此�,還可以在LDP的“LILO mini-HOWTO”中找到LILO的使用指��
GRUB是GNU�(jì)劃的主要bootloader。GRUB最初是由Erich Boleyn為GNU Mach操作系統(tǒng)撰寫(xiě)的引�(dǎo)程序。后�(lái)有Gordon Matzigkeit和Okuji Yoshinori接替Erich的工�,繼�(xù)維護(hù)和開(kāi)�(fā)GRUB。GRUB的網(wǎng)站https://www.gnu.org/software/grub/上有�(duì)套件使用的說(shuō)明文�,叫作《GRUB manual�。GRUB能夠使用TFTP和BOOTP或者DHCP通過(guò)�(wǎng)�(luò)啟動(dòng),這種功能�(duì)于系�(tǒng)�(kāi)�(fā)�(guò)程很有用�
除了傳統(tǒng)的Linux系統(tǒng)上的引導(dǎo)程序以外,還有其他一些引�(dǎo)程序,也可以支持磁盤(pán)引導(dǎo)啟動(dòng)。例如:LoadLin可以從DOS下啟�(dòng)Linux;還有ROLO、LinuxBIOS,U-Boot也支持這種功能�
3.Flash啟動(dòng)方式
大多�(shù)嵌入式系�(tǒng)上都使用Flash存儲(chǔ)介質(zhì)。Flash有很多類�,包括NOR Flash、NAND Flash和其他半�(dǎo)體盤(pán)。其�,NOR Flash(也就是線性Flash)使用最為普��
NOR Flash可以支持隨機(jī)訪問(wèn),所以代碼是可以直接在Flash上執(zhí)行的。Bootloader一般是存儲(chǔ)在Flash芯片上的。另�,Linux�(nèi)核映像和RAMDISK也可以存�(chǔ)在Flash�。通常需要把Flash分區(qū)使用,每�(gè)區(qū)的大小應(yīng)該是Flash擦除塊大小的整數(shù)�。圖2是Bootloader和內(nèi)核映像以及文件系�(tǒng)的分區(qū)��
�2 Flash存儲(chǔ)示意�
Bootloader一般放在Flash的底端或者頂�,這要根據(jù)處理器的�(fù)位向量設(shè)�。要使Bootloader的入口位于處理器上電�(zhí)行條指令的位��
接下�(lái)分配參數(shù)區(qū),這里可以作為Bootloader的參�(shù)保存區(qū)��
再下�(lái)�(nèi)核映像區(qū)。Bootloader引導(dǎo)Linux�(nèi)�,就是要從這�(gè)地方把內(nèi)核映像解壓到RAM中去,然后跳�(zhuǎn)到內(nèi)核映像入口執(zhí)��
然后是文件系�(tǒng)區(qū)。如果使用Ramdisk文件系統(tǒng),則需要Bootloader把它解壓到RAM�。如果使用JFFS2文件系統(tǒng),將直接掛接為根文件系統(tǒng)。這兩種文件系�(tǒng)將在�12章詳�(xì)講解�
還可以分出一些數(shù)�(jù)區(qū),這要根據(jù)�(shí)際需要和Flash大小�(lái)考慮��
這些分區(qū)是開(kāi)�(fā)者定義的,Bootloader一般直接讀�(xiě)�(duì)�(yīng)的偏移地址。到了Linux�(nèi)核空�,可以配置成MTD�(shè)備來(lái)訪問(wèn)Flash分區(qū)。但�,有的Bootloader也支持分區(qū)的功�,例如:Redboot可以�(chuàng)建Flash分區(qū)�,并且內(nèi)核MTD�(qū)�(dòng)可以解析出redboot的分區(qū)��
除了NOR Flash,還有NAND Flash、Compact Flash、DiskOnChip等。這些Flash具有芯片�(jià)格低,存�(chǔ)容量大的特點(diǎn)。但是這些芯片一般通過(guò)專用控制器的I/O方式�(lái)訪問(wèn),不能隨�(jī)訪問(wèn),因此引�(dǎo)方式跟NOR Flash也不�。在這些芯片�,需要配置專用的引導(dǎo)程序。通常,這種引導(dǎo)程序起始的一段代碼就把整�(gè)引導(dǎo)程序�(fù)制到RAM中運(yùn)�,從而實(shí)�(xiàn)自舉啟動(dòng),這跟從磁�(pán)上啟�(dòng)有些相似.
BootLoader除了依賴� CPU 的體系結(jié)�(gòu)外,BootLoader �(shí)際上也依賴于具體的嵌入式板級(jí)�(shè)備的配置,比如板卡的硬件地址分配,RAM芯片的類型,其他外設(shè)的類型等�
�(duì)于兩塊不同的嵌入式板而言,即使它們是基于同一� CPU而構(gòu)建的,如果他們的硬件資源和配置不一致的�,要想讓�(yùn)行在一塊板子上的BootLoader程序也能�(yùn)行在另一塊板子上,也還是需要作一些必要的修改�
系統(tǒng)加電或復(fù)位后,所有的CPU通常都從CPU制造商�(yù)先安排的地址上取指令。比�,S3C44B0在復(fù)位時(shí)都從地址 0x00000000 取它的條指令�
嵌入式系�(tǒng)通常都有某種類型的固�(tài)存儲(chǔ)�(shè)�(比如:ROM、EEPROM或FLASH�)被安排這�(gè)起始地址上,因此在系�(tǒng)加電�,CPU將首先執(zhí)行BootLoader程序�
也就是說(shuō)�(duì)于基于S3C44B0的這套系統(tǒng),我們的BootLoader是從0地址�(kāi)始存放的,而這塊起始地址需要采用可引導(dǎo)的固�(tài)存儲(chǔ)�(shè)備如FLASH�
Boot loader 就是在操作系�(tǒng)�(nèi)核運(yùn)行之前運(yùn)行的一段小程序。通過(guò)這段小程序,可以初始化硬件設(shè)�、建立內(nèi)存空間的映射�,從而將系統(tǒng)的軟硬件�(huán)境帶到一�(gè)合適的狀�(tài),以便為最終調(diào)用操作系�(tǒng)�(nèi)核準(zhǔn)備好正確的環(huán)��
系統(tǒng)加電或復(fù)位后,所有的CPU 通常都從某�(gè)�(yù)先安排的地址上取指令。例如,基于ARM7TDMI core 的CPU 在復(fù)位時(shí)通常都從地址0x00000000取它的條指令。而基于CPU �(gòu)建的嵌入式系�(tǒng)通常都有某種類型的固�(tài)存儲(chǔ)�(shè)備(比如:ROM、EEPROM、或 Flash 等)被映射到這�(gè)�(yù)先安排的地址�。因此在系統(tǒng)加電�,CPU 將首先執(zhí)� Bootloader 程序。�??偸菍oot Loader 安裝在嵌入式系統(tǒng)的存�(chǔ)�(shè)備的最前端�
固態(tài)存儲(chǔ)�(shè)備的空間劃分(地址從低到高順序):Bootloader,Bootloader參數(shù),內(nèi)核映�,根文件系統(tǒng)映像�
維庫(kù)電子�,電子知�(shí),一查百��
已收錄詞�162542�(gè)