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