2009年11月30日 星期一

Bootloader的啟動方式


Bootloader的啟動


Linux系統是通過Bootloader引導啟動的。一上電,就要執行Bootloader來初始化系統。
系統加電或復位後(Reset),所有CPU都會從某個地址開始執行,這是由處理器設計決定的。比如,X86的復位向量在高地址端,ARM處理器在復位時從地址 0x00000000取第一條指令。嵌入式系統的開發板都要把板上ROMFlash映射到這個地址。因此,必須把Bootloader程序存儲在相應的 Flash位置。系統加電後,CPU將從這裡開始執行。


主機和目標機之間一般有串口(RS232或是RJ-45)可以連接,Bootloader軟件通常會通過串口來輸入輸出。例如:輸出出錯或者執行結果信息到串口終端,從串口終端讀取用戶控制命令等。


Bootloader啟動過程通常是多階段的(Vivi分成兩階段head.S(組合語言寫成)init/main.c(C語言寫成)),這樣既能提供復雜的功能,又有很好的可移植性。例如:從Flash啟動的Bootloader多數是兩階段的啟動過程。


大多數Bootloader都包含2種不同的操作模式:本地加載模式和遠程下載模式。這2種操作模式的區別僅對於開發人員才有意義,也就是不同啟動方式的使用。從最終用戶的角度看,Bootloader的作用就是用來加載操作系統,而並不存在所謂的本地加載模式與遠程下載模式的區別。
因為Bootloader的主要功能是引導操作系統啟動,所以我們詳細討論一下各種啟動方式的特點。


1.網路啟動方式
這種方式開發板不需要配置較大的存儲介質,跟無硬碟的工作站有點類似。但是使用這種啟動方式之前,需要把Bootloader安裝到板上的EPROM或者 Flash中。Bootloader通過以太網接口遠程下載Linux內核映像或者文件系統。
使用這種方式也有前提條件,就是目標板有串口、以太網接口或者其他連接方式。串口一般可以作為控制台,同時可以用來下載內核影像和RAMDISK文件系統。串口通信(RS232)傳輸速率過低,不適合用來掛接NFS文件系統。所以以太網接口成為通用的互連設備,一般的開發板都 可以配置10M乙太網接口(RJ-45)
對於PDA等手持設備來說,以太網的RJ-45接口顯得大了些,而USB接口,特別是USB的迷你接口,尺寸非常小。對於開發的嵌入式系統,可以把USB接口虛擬成以太網接口來通訊。這種方式在開發主機和開發板兩端都需要驅動程序。
另外,還要在服務器上配置啟動相關網路服務。Bootloader下載文件一般都使用TFTP網路協議,還可以通過DHCP的方式動態配置IP地址。


2.硬碟啟動方式
傳統的Linux系統運行在桌機或者伺服器上,這些電腦一般都使用BIOS引導,並且使用硬碟作為存儲介質。如果進入BIOS設置菜單,可以探測處理器、內存、硬碟等設備,可以設置BIOS從軟碟片、光碟機或者某顆硬碟啟動。也就是說,BIOS並不直接引導操作系統。那麼在硬碟的主引導區,還需要一個 Bootloader。這個Bootloader可以從硬碟文件系統中把操作系統引導起來。
Linux傳統上是通過LILOLInux LOader)引導的,後來又出現了GNU的軟件GRUBGRand Unified Bootloader)。這2Bootloader廣泛應用在X86Linux系統上。你的開發主機可能就使用了其中一種,熟悉它們有助於配置多種系統引導功能。


LILO軟件工程是由Werner Almesberger創建,專門為引導Linux開發的。現在LILO的維護者是John Coffman,最新版本下載站點:http://lilo.go.dyndns.orgLILO有詳細的文檔,例如LILO套件中附帶使用手冊和參考手冊。此外,還可以在LDP的“LILO mini-HOWTO”中找到LILO的使用指南。
GRUB GNU計劃的主要bootloaderGRUB最初是由Erich BoleynGNU Mach操作系統撰寫的引導程序。後來有Gordon MatzigkeitOkuji Yoshinori接替Erich的工作,繼續維護和開發GRUBGRUB的網站http://www.gnu.org/software/grub/上有對套件使用的說明文件,叫作《GRUB manual》。GRUB能夠使用TFTPBOOTP或者DHCP通過網路啟動,這種功能對於系統開發過程很有用。
除了傳統的Linux系統上的引導程序以外,還有其他一些引導程序,也可以支持硬碟引導啟動。例如:LoadLin可以從DOS下啟動Linux;還有ROLOLinuxBIOSU-Boot也支持這種功能。


3Flash啟動方式
大多數嵌入式系統上都使用Flash存儲介質。Flash有很多類型,包括NOR FlashNAND Flash和其他半導體盤。其中,NOR Flash使用最為普遍。
NOR Flash可以支持隨機訪問,所以程式是可以直接在Flash上執行的。Bootloader一般是存儲在Flash芯片上的。
Bootloader一般放在Flash的底端或者頂端,這要根據處理器的復位向量(Reset)設置。要使Bootloader的入口位於處理器上電執行第一條指令的位置。
接下來分配參數區,這裡可以作為Bootloader的參數保存區域。
再下來內核映像區。Bootloader引導Linux內核,就是要從這個地方把內核映像解壓到RAM中去,然後跳轉到內核映像入口執行。
然後是文件系統區。如果使用Ramdisk文件系統,則需要Bootloader把它解壓到RAM中。
最後還可以分出一些數據區,這要根據實際需要和Flash大小來考慮了。
這些分區是開發者定義的,Bootloader一般直接讀寫對應的偏移地址。到了Linux內核空間,可以配置成MTD設備來訪問Flash分區。
除了NOR Flash,還有NAND FlashCompact FlashDiskOnChip等。這些Flash具有芯片價格低,存儲容量大的特點。但是這些芯片一般通過專用控制器的I/O方式來訪問,不能隨機訪問,因此引導方式跟NOR Flash也不同。在這些芯片上,需要配置專用的引導程序。通常,這種引導程序起始的一段程式就把整個引導程序複製到RAM中運行,從而實現自行啟動,這跟從硬碟上啟動相似。