BootLoader

小程序

Boot Loader 是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬體設備、建立內存空間的映射圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終調用操作系統內核準備好正確的環境。

簡介


BootLoader
BootLoader
BootLoader是系統加電啟運行的第一段軟體代碼,回憶一下PC的體系結構我們可以知道,PC機中的引導載入程序由BIOS(其本質就是一段固件程序)和位於硬碟MBR中的引導程序一起組成。BIOS在完成硬體檢測和資源分配后,將硬碟MBR中的引導程序讀到系統的RAM中,然後將控制權交給引導程序。引導程序的主要運行任務就是將內核映象從硬碟上讀到RAM中 然後跳轉到內核的入口點去運行,也即開始啟動操作系統。
而在嵌入式系統中,通常並沒有像BIOS那樣的固件程序(有的嵌入式系統也會內嵌一段短小的啟動程序),因此整個系統的載入啟動任務就完全由BootLoader來完成.比如在一個基於 ARM7TDMI core的嵌入式系統中,系統在上電或複位時都從地址 0x00000000開始執行.而在這個地址處安排的通常就是系統的BootLoader程序。
簡單地說BootLoader就是在操作系統內核或用戶應用程序運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬體設備、建立內存空間的映射圖(有的CPU沒有內存映射功能如 S3C44B0),從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終調用操作系統內核或用戶應用程序準備好正確的環境。對於一個嵌入式系統來說,可能有的包括操作系統,有的小型系統也可以只包括應用程序,但是在這之前都需要BootLoader為它準備一個正確的環境。通常,BootLoader是依賴於硬體而實現的,特別是在嵌入式領域,為嵌入式系統建立一個通用的BootLoader是很困難的。
反過來,大部分Bootloader仍然具有很多共性,某些Bootloader也能夠支持多種體系結構的嵌入式系統。例如,U-Boot就同時支持PowerPC、ARM、MIPS和X86等體系結構,支持的板子有上百種。通常,它們都能夠自動從存儲介質上啟動,都能夠引導操作系統啟動,並且大部分都可以支持串口和乙太網介面。
通常,BootLoader是嚴重地依賴於硬體而實現的,特別是在嵌入式平台。因此,在嵌入式平台里建立一個通用的BootLoader幾乎是不可能的。儘管如此,我們仍然可以對bootloader歸納出一些通用的概念來,以指導用戶特定的BootLoader設計與實現。
在專用的嵌入式板子運行GNU/Linux系統已經變得越來越流行。一個嵌入式Linux系統從軟體的角度看通常可以分為四個層次:
1、引導載入程序。包括固化在固件(firmware)中的boot代碼(可選),和BootLoader兩大部分。
2、Linux內核。特定於嵌入式板子的定製內核以及內核的啟動參數。
3、文件系統。包括根文件系統和建立於Flash內存設備之上文件系統。通常用ramdisk來作為rootfs 。
4、用戶應用程序。特定於用戶的應用程序。有時在用戶應用程序和內核層之間可能還會包括一個嵌入式圖形用戶界面。常用的嵌入式GUI有:MicroWindows和MiniGUI等。

種類


常用引導程序
常用引導程序
嵌入式系統世界已經有各種各樣的Bootloader,種類劃分也有多種方式。除了按照處理器體系結構不同劃分以外,還有功能複雜程度的不同。
首先區分一下“Bootloader”和“Monitor”的概念。嚴格來說,“Bootloader”只是引導設備並且執行主程序的固件;而“Monitor”還提供了更多的命令行介面,可以進行調試、讀寫內存、燒寫Flash、配置環境變數等。“Monitor”在嵌入式系統開發過程中可以提供很好的調試功能,開發完成以後,就完全設置成了一個“Bootloader”。所以,習慣上大家把它們統稱為Bootloader。
表列出了Linux的開放源碼引導程序及其支持的體系結構。表中給出了X86 ARM PowerPC體系結構的常用引導程序,並且註明了每一種引導程序是不是“Monitor”。
(1)X86
X86的工作站和伺服器上一般使用LILO和GRUB。LILO是Linux發行版主流的Bootloader。不過Redhat Linux發行版已經使用了GRUB,GRUB比LILO有更有好的顯示界面,使用配置也更加靈活方便。在某些X86嵌入式單板機或者特殊設備上,會採用其他Bootloader,例如:rolo。這些Bootloader可以取代BIOS的功能,能夠從FLASH中直接引導Linux啟動。現在ROLO支持的開發板已經併入U-Boot,所以U-Boot也可以支持X86平台。
(2)ARM
ARM處理器的晶元商很多,所以每種晶元的開發板都有自己的Bootloader。結果ARM bootloader也變得多種多樣。最早有為ARM720處理器的開發板的固件,又有了armboot,StrongARM平台的blob,還有S3C2410處理器開發板上的vivi等。現在armboot已經併入了U-Boot,所以U-Boot也支持ARM/XSCALE平台。U-Boot已經成為ARM平台事實上的標準Bootloader。
(3)PowerPC
PowerPC平台的處理器有標準的Bootloader,就是ppcboot。PPCBOOT在合併armboot等之後,創建了U-Boot,成為各種體系結構開發板的通用引導程序。U-Boot仍然是PowerPC平台的主要Bootloader。
(4)MIPS
MIPS公司開發的YAMON是標準的Bootloader,也有許多MIPS晶元商為自己的開發板寫了Bootloader。現在,U-Boot也已經支持MIPS平台。
(5)SH
SH平台的標準Bootloader是sh-boot。Redboot在這種平台上也很好用。
(6)m68k
M68K平台沒有標準的Bootloader。Redboot能夠支持m68k系列的系統。值得說明的是Redboot,它幾乎能夠支持所有的體系結構,包括MIPS、SH、M68K等體系結構。Redboot是以eCos為基礎,採用GPL許可的開源軟體工程。

作用原理


1、Boot Loader 所支持的 CPU 和嵌入式板
每種不同的 CPU 體系結構都有不同的Boot Loader。有些 Boot Loader 也支持多種體系結構的 CPU,比如 U-Boot 就同時支持 ARM 體系結構和MIPS 體系結構。除了依賴於 CPU的體系結構外,Boot Loader 實際上也依賴於具體的嵌入式板級設備的配置。這也就是說,對於兩塊不同的嵌入式板而言,即使它們是基於同一種 CPU 而構建的,要想讓運行在一塊板子上的 Boot Loader 程序也能運行在另一塊板子上,通常也都需要修改 Boot Loader 的源程序。
2、Boot Loader 的安裝媒介(Installation Medium)
系統加電或複位后,所有的CPU 通常都從某個由 CPU 製造商預先安排的地址上取指令。比如,基於 ARM7TDMI core 的 CPU 在複位時通常都從地址 0x00000000 取它的第一條指令。而基於CPU 構建的嵌入式系統通常都有某種類型的固態存儲設備(比如:ROM、EEPROM 或 FLASH 等)被映射到這個預先安排的地址上。因此在系統加電后,CPU 將首先執行Boot Loader 程序。
3、用來控制 Boot Loader 的設備或機制
主機和目標機之間一般通過串口建立連接,Boot Loader 軟體在執行時通常會通過串口來進行 I/O,比如:輸出列印信息到串口,從串口讀取用戶控制字元等。
4、Boot Loader 的啟動過程是單階段(Single Stage)還是多階段(Multi-Stage)
通常多階段的 Boot Loader 能提供更為複雜的功能,以及更好的可移植性。從固態存儲設備上啟動的。
6、BootLoader 與主機之間進行文件傳輸所用的通信設備及協議程,也即啟動過程可以分為 stage 1和 stage 2 兩部分。而至於在 stage 1 和 stage 2 具體完成哪些任務將在下面幾篇討論。
5、Boot Loader 的操作模式 (Operation Boot Loader 大多都是 2 階段的啟動過Mode)。

構成組件


BootLoader主要由以下兩部分組成。
(1)OEM startup code
這部分代碼是在BootLoader中最先被執行的。它的主要功能是初始化最小範圍的硬體設備,比如設置CPU工作頻率、關閉看門狗、設置cache、設置RAM的刷新率、填寫內存控制寄存器(通知CPU有效的數據匯流排引腳數)等。由於系統剛剛啟動,不適合使用複雜的高級語言,因此這部分代碼主要由彙編程序完成。在彙編程序段設置完堆棧后,就跳轉到C語言的Main函數入口(位於/eboot/main.c);
(2)Main code
這部分代碼由C語言實現,是BLCOMMON代碼的一部分,它可以用來執行比較複雜的操作。比如檢測內存和Flash的有效性、檢測外部設備介面、檢測串口並且向已經連接的主機發送調試信息、通過串口等待命令、啟動網路介面、建立內存映射等彙編無法完成的工作。
Main code包含以下代碼段:
Image download代碼段
Image的下載可以通過以下介面。
① A. Parallel port I/O介面。這是通過主機和目標機的並口之間的數據傳輸來完成下載工作。具體實現代碼,讀者可以參考/kernel/hal/mdppfs.c文件;
② Ethernet port I/O介面。這是通過主機和目標機的網路介面之間的數據傳輸來完成下載工作。具體實現代碼,讀者可以參考WINCE420/public/common/oak/DRIVE|RS/ETHDBG/EBOOT文件夾;
③ Debug serial I/O介面。這是通過主機和目標機的串口之間的數據傳輸來完成下載工作。利用串口來傳輸的缺點非常明顯,那就是速度太慢;
通過事先Flash write代碼將鏡像文件固化入Flash。只要BootLoader被設計成能從Flash載入鏡像文件,本選項就可以使用。

啟動方式


網路啟動示意圖
網路啟動示意圖
1、網路啟動方式
這種方式開發板不需要配置較大的存儲介質,跟無盤工作站有點類似。但是使用這種啟動方式之前,需要把Bootloader安裝到板上的EPROM或者Flash中。Bootloader通過乙太網介面遠程下載Linux內核映像或者文件系統。第4章介紹的交叉開發環境就是以網路啟動方式建立的。這種方式對於嵌入式系統開發來說非常重要。使用這種方式也有前提條件,就是目標板有串口、乙太網介面或者其他連接方式。串口一般可以作為控制台,同時可以用來下載內核影像和RAMDISK文件系統。串口通信傳輸速率過低,不適合用來掛接NFS文件系統。所以乙太網介面成為通用的互連設備,一般的開發板都可以配置10M乙太網介面。
對於PDA等手持設備來說,乙太網的RJ-45介面顯得大了些,而USB介面,特別是USB的迷你介面,尺寸非常小。對於開發的嵌入式系統,可以把USB介面虛擬成乙太網介面來通訊。這種方式在開發主機和開發板兩端都需要驅動程序。
另外,還要在伺服器上配置啟動相關網路服務。Bootloader下載文件一般都使用TFTP網路協議,還可以通過DHCP的方式動態配置IP地址。DHCP/BOOTP服務為Bootloader分配IP地址,配置網路參數,然後才能夠支持網路傳輸功能。如果Bootloader可以直接設置網路參數,就可以不使用DHCP。TFTP服務為Bootloader客戶端提供文件下載功能,把內核映像和其他文件放在/tftpboot目錄下。這樣Bootloader可以通過簡單的TFTP協議遠程下載內核映像到內存。
2、磁碟啟動方式
傳統的Linux系統運行在台式機或者伺服器上,這些計算機一般都使用BIOS引導,並且使用磁碟作為存儲介質。如果進入BIOS設置菜單,可以探測處理器、內存、硬碟等設備,可以設置BIOS從軟盤、光碟或者某塊硬碟啟動。也就是說,BIOS並不直接引導操作系統。那麼在硬碟的主引導區,還需要一個Bootloader。這個Bootloader可以從磁碟文件系統中把操作系統引導起來。
Linux傳統上是通過LILO(LInux LOader)引導的,後來又出現了GNU的軟體GRUB(GRand Unified Bootloader)。這2種Bootloader廣泛應用在X86的Linux系統上。你的開發主機可能就使用了其中一種,熟悉它們有助於配置多種系統引導功能。LILO軟體工程是由Werner Almesberger創建,專門為引導Linux開發的。現在LILO的維護者是John Coffman,最新版本下載站點:。LILO有詳細的文檔,例如LILO套件中附帶使用手冊和參考手冊。此外,還可以在LDP的“LILO mini-HOWTO”中找到LILO的使用指南。
GRUB是GNU計劃的主要bootloader。GRUB最初是由Erich Boleyn為GNU Mach操作系統撰寫的引導程序。後來有Gordon Matzigkeit和Okuji Yoshinori接替Erich的工作,繼續維護和開發GRUB。GRUB的網站http://www.gnu.org/software/grub/上有對套件使用的說明文件,叫作《GRUB manual》。GRUB能夠使用TFTP和BOOTP或者DHCP通過網路啟動,這種功能對於系統開發過程很有用。除了傳統的Linux系統上的引導程序以外,還有其他一些引導程序,也可以支持磁碟引導啟動。例如:LoadLin可以從DOS下啟動Linux;還有ROLO、LinuxBIOS,U-Boot也支持這種功能。
3、Flash啟動方式
大多數嵌入式系統上都使用Flash存儲介質。Flash有很多類型,包括NOR Flash、NAND Flash和其他半導體盤。其中,NOR Flash(也就是線性Flash)使用最為普遍。NOR Flash可以支持隨機訪問,所以代碼是可以直接在Flash上執行的。Bootloader一般是存儲在Flash晶元上的。另外,Linux內核映像和RAMDISK也可以存儲在Flash上。通常需要把Flash分區使用,每個區的大小應該是Flash擦除塊大小的整數倍。
Bootloader一般放在Flash的底端或者頂端,這要根據處理器的複位向量設置。要使Bootloader的入口位於處理器上電執行第一條指令的位置。
接下來分配參數區,這裡可以作為Bootloader的參數保存區域。再下來內核映像區。Bootloader引導Linux內核,就是要從這個地方把內核映像解壓到RAM中去,然後跳轉到內核映像入口執行。然後是文件系統區。如果使用Ramdisk文件系統,則需要Bootloader把它解壓到RAM中。如果使用JFFS2文件系統,將直接掛接為根文件系統。最後還可以分出一些數據區,這要根據實際需要和Flash大小來考慮了。
這些分區是開發者定義的,Bootloader一般直接讀寫對應的偏移地址。到了Linux內核空間,可以配置成MTD設備來訪問Flash分區。但是,有的Bootloader也支持分區的功能,例如:Redboot可以創建Flash分區表,並且內核MTD驅動可以解析出redboot的分區表。除了NOR Flash,還有NAND Flash、Compact Flash、DiskOnChip等。這些Flash具有晶元價格低,存儲容量大的特點。但是這些晶元一般通過專用控制器的I/O方式來訪問,不能隨機訪問,因此引導方式跟NOR Flash也不同。在這些晶元上,需要配置專用的引導程序。通常,這種引導程序起始的一段代碼就把整個引導程序複製到RAM中運行,從而實現自舉啟動,這跟從磁碟上啟動有些相似。

操作模式


大多數BootLoader都包含兩種不同的操作模式。“啟動載入”模式和“下載”模式,這種區別僅對於開發人員才有意義。但從最終用戶的角度看,BootLoader的作用就是用來載入操作系統,而並不存在所謂的啟動載入模式與下載工作模式的區別。
啟動載入(Boot loading)模式:這種模式也稱為“自主”(Autonomous)模式,也即BootLoader從目標機上的某個固態存儲設備上將操作系統載入到RAM中運行,整個過程並沒有用戶的介入。這種模式是BootLoader的正常工作模式。因此在嵌入式產品發布的時候,BootLoader顯然必須工作在這種模式下。
下載(Down loading)模式:在這種模式下 目標機上的BootLoader將通過串口連接或網路連接等通信手段從主機下載文件,比如:下載應用程序、數據文件、內核映像等.從主機下載的文件通常首先被BootLoader保存到目標機的RAM中然後再被BootLoader寫到目標機上的固態存儲設備中。BootLoader的這種模式通常在系統更新時使用。工作於這種模式下的BootLoader通常都會向它的終端用戶提供一個簡單的命令行介面。
在教學系統中提供的BootLoader中沒有實現自主模式,可以通過修改代碼來實現該功能。 BootLoader與主機之間進行文件傳輸所用的通信設備及協議。
最常見的情況就是,目標機上的BootLoader通過串口與主機之間進行文件傳輸,傳輸可以簡單的採用直接數據收發,當然在串口上也可以採用xmode/ymode/zmode協議以及在乙太網上採用TPTP協議。
此外,在論及這個話題時,主機方所用的軟體也要考慮。比如,在通過乙太網連接和TFTP協議來下載文件時,主機方必須有一個軟體用來提供TFTP服務。
引導載入程序是系統加電后運行的第一段代碼。我們熟悉的PC中的引導程序一般由BIOS和位於MBR的OS bootloader(例如LILO或者GRUB)一起組成。然而在嵌入式系統中通常沒有像BIOS那樣的固件程序(有的嵌入式CPU有),因此整個系統的載入啟動任務就完全由bootloader來完成。在嵌入式Linux中,引導載入程序即等效為bootloader。

安裝位置


Boot loader 就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,可以初始化硬體設備、建立內存空間的映射圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終調用操作系統內核準備好正確的環境。
系統加電或複位后,所有的CPU 通常都從某個預先安排的地址上取指令。例如,基於ARM7TDMI core 的CPU 在複位時通常都從地址0x00000000取它的第一條指令。而基於CPU 構建的嵌入式系統通常都有某種類型的固態存儲設備(比如:ROM、EEPROM、或 Flash 等)被映射到這個預先安排的地址上。因此在系統加電后,CPU 將首先執行 Bootloader 程序。通常總是將Boot Loader 安裝在嵌入式系統的存儲設備的最前端。
固態存儲設備的空間劃分(地址從低到高順序):Bootloader,Bootloader參數,內核映像,根文件系統映像。
bootloader是依賴於硬體而實現的,特別是在嵌入式系統中。不同的體系結構需求的bootloader是不同的;除了體系結構,bootloader還依賴於具體的嵌入式板級設備的配置。也就是說,對於兩塊不同的嵌入式板而言,即使它們基於相同的CPU構建,運行在其中一塊電路板上的bootloader,未必能夠運行在另一塊電路開發板上。
Bootloader的啟動過程可以是單階段的,也可以是多階段的。通常多階段的bootloader能提供更為複雜的功能,以及更好的可移植性。從固態存儲設備上啟動的bootloader大多數是二階段的啟動過程,也即啟動過程可以分為stage 1和stage 2兩部分。

編寫步驟


第一步:要進行相關硬體的初使化,比如在at91rm9200這塊嵌入式板子上(以後都使用這一款晶元,主要是我對這款晶元比較熟悉,嘿嘿),大概要做接下來的幾方面的工作,其一:將CPU
CPU
CPU也稱為中央處理器,是電子計算機的主要設備之一。其功能主要是解釋計算機指令以及處理計算機軟體中的數據。所謂的計算機的可編程性主要是指對CPU的編程。CPU是計算機中的核心配件,只有火柴盒那麼大,幾十張紙那麼厚,但它卻是一台計算機的運算核心和控制核心。計算機中所有操作都由CPU負責讀取指令,對指令解碼並執行指令的核心部件。CPU、內部存儲器和輸入/輸出設備是電子計算機的三大核心部件。
模式切換進系統模式,關閉系統中斷,關閉看門狗,根據具體情況進行內存內存內存的正式叫法是內存儲器,以此來與外存儲器區分開。物理上它安裝在計算機內部,通常安裝在主板上,所以稱為內存。它的作用是供暫時存儲處理器需要處理的數據或處理后的結果,可見內存是計算機處理器的工作空間。它是處理器運行的程序和數據必須駐留於其中的一個臨時存儲區域,是計算機十分重要的部件。區域映射,初始化內存控制區,包括所使用的內存條的相關參數,刷新頻率等,其二:設定系統運行頻率,包括使用外部晶振晶振晶振:即所謂石英晶體諧振器和石英晶體時鐘振蕩器的統稱。不過由於在消費類電子產品中,諧振器用的更多,所以一般的概念中把晶振就等同於諧振器理解了。
後者就是通常所指鍾振,設置CPU頻率,設置匯流排匯流排匯流排是將信息以一個或多個源部件傳送到一個或多個目的部件的一組傳輸線。通俗的說,就是多個部件間的公共連線,用於在各個部件之間傳輸信息。人們常常以MHz表示的速度來描述匯流排頻率。頻率,設置外部設備所採用的頻率等。其三:設置系統中斷相關,包括定時器,定時器是裝有時段或時刻控制機構的開關裝置。它有一個頻率穩定的振蕩源,通過齒輪傳動或集成電路分頻計數,當將時間累加到預置數值時,或指示到預置的時刻處,定時器即發送信號控制執行機構。
中斷,是否使用FIQ中斷,外部中斷等,還有就是中斷優先順序設置,這裡只實現兩個優先順序,只有時鐘中斷高一級,其它都一樣,而中斷向量初始化時都將這些中斷向量指向0x18處,並關閉這裡的所有中斷,如果板子還接有諸如FLASH設備的話,還需要設置諸如FLASH相關操制寄存器,其四:需要關閉CACHE,到此為止,晶元相關內容就完成初始化了。
第二步:中斷向量表,ARM的中斷與PC機晶元的中斷向量表有一點差異,嵌入式設備為了簡單,當發生中斷時,由CPU直接跳入由0x0開始的一部分區域(ARM晶元自身決定了它中斷時就會跳入0x0開始的一片區域內,具體跳到哪個地址是由中斷的模式決定的,一般用到的就是複位中斷,FIQ,IRQ中斷,SWI中斷,指令異常中斷,數據異常中斷,預取指令異常中斷),而當CPU進入相應的由0x0開始的向量表中時,這就需要用戶自己編程接管中斷處理程序了,這就是需要用戶自己編寫中斷向量表,中斷向量表裡存放的就是一些跳轉指令,比如當CPU發生一個IRQ中斷時,就會自動跳入到0x18處,這裡就是用戶自己編寫的一個跳轉指令,假如用戶在此編寫了一條跳轉到0x20010000處的指令,那麼這個地址就是一個總的IRQ中斷處理入口,一個CPU可能有多個IRQ中斷,在這個總的入口處如何區分不同的中斷呢?就由用戶編程來決定了,具體實現請參見以後相關部分,中斷向量表的一般用一個vector.S文件,當然,如何命名那是你自己的喜愛,但有一點需要聲明,那就是在鏈接時一定要將它定位在0x0處。
第三步:設置堆棧,一般使用三個棧,一個是IRQ棧,一個是系統模式下的棧(系統模式下和用戶模式共享寄存器和內存空間,這主要是為了簡單),設置棧的目的主要是為了進行函數調用和局部變數的存放,不可能全用彙編,也不可能不用局部變數
第四步:將自己以後的代碼段和數據段全部拷貝至內存,並將BSS段清零
第五步:進行串口,串口是計算機上一種非常通用的設備通信協議,大多數計算機包含兩個基於RS232的串口。串口同時也是儀器儀錶設備的通信協議,並可用於獲取遠程採集設備的數據的初始化(主要是為了與用戶交互,進行與PC機的文件傳輸),FLASH的初始化這裡在FLASH中存放BOOT和內核),FLASH驅動的編寫(這裡的驅動有別於平常所說的驅動,由於FLASH不像SDRAM,只要設定了相關控制器之後就可以直接讀寫指定地址的數據,對FLASH的寫操作是一塊一塊數據進行,而不是一個位元組一個位元組地寫,具體請查閱相關資料)
第六步:等待一定的秒數,來接收用戶進行輸入,如果在指定的秒數內用戶未輸入任何字元,那麼BOOT就開始在FLASH中的指定位置(可以由自己指定,這麼做主要是為了簡單)讀取內核的所有數據到內存中(具體是內存中的什麼位置由自己指定,也可以採用Linux之類的做法,就是在內存的起始位置加上一個0x8000處),將跳轉到內核的第一條代碼處);如果用戶在指定的秒數內鍵入了字元(這主要是為了方便開發,如果開發定型之後完全可以不要這段代碼),那麼就在串口與用戶進行交互,接受用戶在串口輸入的命令,比如用戶要求下載文件在FLASH中指定的位置等,具體內容可參考U-BOOT之類的開源項目到這裡為止,BOOT部分已完成,這個BOOT非常簡單,僅僅只是將PC機上傳下來的文件固化到FLASH中,然後再將FLASH中的操作系統內核部分載入進內存中,並將CPU的控制權交給操作系統。

移植


Bootloader廣泛用於有操作系統的手持終端設備、智能家電及機頂盒等嵌入式設備上,它負責完成硬體初始化、操作系統引導和系統配製等,相當於PC機上的BIOS對於一個嵌入式的Linux系統而言,Bootloader是整個系統運行的基礎。但是對於不同的ARM平台而言所使用的Bootloader都會有所不同。完成 Bootloader的移植是在特定的硬體平台上實現系統構建和運行的至關重要的一個步驟。