Bootloader的含義
PC機上windows、linux引導過程簡介
嵌入式Bootloader介紹與分析
嵌入式bootloader介紹
Bootloader的操作模式
Bootloader的安裝及啓動媒介
Bootloader的啓動過程
Bootloader的通信設備及協議
Bootloader:中文解釋爲啓動引導程序
可以工作在無操作系統的環境下,也可以工作在有操作系統的環境下
在無操作系統環境下:
通常表現爲:與應用程序編譯在一起,在應用程序之前運行的一段代碼,一般由彙編編寫
完成節基本硬件及對戰的初始化,爲應用程序做準備
人們通常說的bootloader一般特指在操作系統下:
在操作系統運行之前運行的一段或多段程序
初始化硬件設備、建立系統的內存空間映射圖,將系統的軟件硬件環境帶到一個合適的狀態,爲調用操作系統內核準備好正確的環境
把操作系統內核映像加載到RAM中,並將系統控制權交給它
Bootloader的種類非常的繁多
針對不同的cpu架構對bootloader的要求不同
針對X86上有LILO、GRUB、ntloader等
針對ARM架構的有u-boot、vivi、armboot等
針對ppc架構的有ppcboot等
針對不同的操作系統也有所不同:
比如專門用來啓動linux的vivi
啓動Wince的eboot、啓動eCose的reboot,可以啓動多種操作系統的u-boot等
下表將一些常用bootloader做簡單對比介紹
Bootloader Monitor 描述 X86 ARM
LILO 否 Linux磁盤引導程序 是 否
GRUB 否 GNU的LILO替代程序 是 否
Loadlin 否 從DOS引導Linux 是 否
ntldr 否 從x86上引導windowsNT系列 是 否
armboot 是 專門爲arm架構設計的boot 否 是
ppcboot 是 專門設計用來引導基於ppc架構操作系統的loader,u-boot前身 否 是
U-Boot 是 通用引導程序,支持多種CPU架構、多種操作系統引導 是 是
RedBoot 是 基於eCos的引導程序 是 是
vivi 是 Mizi公司針對SAMSUNG的ARM CPU設計的引導程序 否 是
下面我們以ntldr和grub爲例講解一下在PC機上windowsXP和linux是如何引導起來的
無論windows還是linux都是採用多階段引導方式從大的角度分爲:硬件+軟件
硬件部分由固化在PC主板上的BIOS完成
windows與linux完全一致
軟件部分由安裝在硬盤的bootloader完成
linux常用LILO、GRUB
windows有引導2000\XP\2003系列的ntloader
引導vista、win7系列的Bootmgr等
首先介紹一下BIOS的相關知識:
BIOS是固化在計算機主板上一個芯片,裏面固化着我們常說的bios程序
bios在cpu開機啓動時首先被啓動
bios讀取CMOS中的配置參數,完成硬件檢測(內存、CPU、顯卡、鼠標等)、中斷初始化等工作
cmos也是主板上的一塊芯片,保存了bios的一些配置及硬件檢測信息,採用ram結構,掉電丟失需要電池供電
最終bios根據啓動選項讀取硬盤MBR分區(0柱面0磁頭1扇區)上的引導程序,完成第二階段引導過程
Bios程序一般固化在EEROM或FLASH中,掉電不丟失數據,可以使用特定的軟件進行升級、更新
系統開機時可以通過特定按鍵(del、F2等)啓動“系統設置程序”(我們常見的藍色屏幕)進行基本功能設置
設置完成後結果會保存在cmos中,cmos採用ram電路構成,由主板上的一個電池供電,保證信息不丟失
目前市面上較流行的主板BIOS主要有 Award BIOS、AMI BIOS、Phoenix BIOS三種類型
絕大多數臺式機都採用的Award BIOS,筆記本上一半採用Phoenix BIOS較多
Bios最後一階段會讀取硬盤0柱面0磁頭1扇區上程序完成後續初始化,此分區稱爲MBR分區,由三部分組成:共512字節
主引導程序:446個字節
負責從活動分區中裝載、運行系統引導程序
硬盤分區表(DPT):64個字節
記錄了硬盤中分區的數量以及每一分區的大小
每個分區佔16個字節,最多只能有4個主分區
第三部分是magic number,佔2個字節,固定爲55AA
MBR主引導代碼掃描硬盤分區表,找到一個可引導分區
(活動分區)
將該分區的第一個扇區讀到內存,並將控制轉移給它
此分區被稱爲“引導分區”,引導分區的第一個扇區稱爲“引導扇區”,引導扇區上運行着軟件引導的第二部分(OBR)
以windowsNT系列爲例,假如我們在C盤下安裝了windows xp,系統安裝時會自動在MBR分區、引導分區安裝相應的軟件程序
MBR主引導程序找到了活動分區C盤
然後執行C盤(0柱面1磁頭1扇區)上的引導程序OBR(操作系統引導扇區)
OBR找到c盤目錄下的NTLDR引導程序並加載,NTLDR讀取BOOT.ini文件顯示引導項
最後加載系統內核
Linux下常見的引導程序有兩種,LILO、GRUB
LILO是歷史比較悠久、功能比較強大的一款bootloader,在linux剛開始時就已經出現
GNU GRUB(簡稱“GRUB”)是一個來自GNU項目的多操作系統啓動程序,逐漸已經代替了的LILO的地位
GRUB是多啓動規範的實現,它允許用戶可以在計算機內同時擁有多個操作系統,並在計算機啓動時選擇希望運行的操作系統
不但可以引導linux還可以windows
GRUB可用於選擇操作系統分區上的不同內核,也可用於向這些內核傳遞啓動參數
GRUB引導linux與windows的引導過程有些類似
在MBR分區安裝主引導程序(grub第一階段代碼)
(會覆蓋windows分區寫入的信息)
在引導分區安裝grub第二階段代碼
此階段代碼會尋找配置文件(menu.lst),根據menu.lst的列表啓動操作系統
(windows、linux均可以引導)
如果menu.lst損壞或按下了特定按鍵,可以進入一個命令行接口,由用戶手動操作引導操作系統
在專用的嵌入式系統上運行GNU/Linux系統已經變得越來越流行
一個嵌入式Linux系統從軟件的角度看通常可以分爲四個層次:
引導加載程序:
BootLoader(一般僅由軟件部分組成)
Linux內核:
特定於嵌入式系統的定製內核以及內核啓動參數
文件系統:
根文件系統和建立於Flash內存設備之上文件系統
用戶應用程序:
特定於用戶的應用程序
嵌入式領域通常Bootloader對硬件的依賴性非常強,建立一個通用的Bootloader幾乎是不可能的
Bootloader依賴於CPU體系結構,不同的CPU架構,如arm、x86、mips等要求的啓動配置不同
基於同一架構的不同芯片,例如同樣基於ARM920T的S3C2410、S3C2440,要求配置不同
基於同一芯片設計的不同開發板,由於外設資源的不同,同樣需要修改配置
Bootloader還依賴於內核的具體格式與類型:
如壓縮、非壓縮內核,nand或nor啓動的內核等
因此bootloader的移植與修改工作就是圍繞以上幾點進行的
從最終用戶的角度看,Bootloader的作用就是加載操作系統
對於開發人員來說,Bootloader包含兩種不同的操作模式:啓動加載模式和下載模式
啓動加載(Boot loading)模式:
BootLoader從目標機上某個固態存儲設備上將操作系統加載到RAM中運行,整個過程並沒有用戶的介入
在嵌入式產品發佈時,BootLoader工作在此模式
下載(Down loading)模式:
開發人員可以使用各種命令,通過串口連接或網絡連接等通信手段從主機下載文件。比如:下載應用程序、數據文件、內核映像等
BootLoader的這種模式通常在系統更新時使用
Bootloader的安裝地址
嵌入式系統一般採用統一編址方式管理數據/程序區,同時使用三總線進行尋址
系統加電覆位後,所有的CPU通常都從某個CPU製造商預先安排的地址上取指令,如基於ARM核的CPU通常從0x00000000取它的第一條指令
嵌入式系統通常都有某種類型的固態存儲設備(如ROM或FLASH)被映射到這個預先安排的地址上
Bootloader被燒寫到其中,所以在系統加電後,CPU將首先執行Bootloader程序
Bootloader啓動方式:
基於以上原理,bootloader提供了多種啓動方式:NOR啓動、nand啓動、SD卡啓動、網絡啓動、DRAM啓動等
NOR FLASH啓動:
NOR FLASH是intel公司推出的一款總線型FLASH存儲器
NOR FLASH一般安裝在總線0x000000—0xXX地址範圍內,並且將bootloader燒寫在NOR的0x00000000地址上
當系統復位時就可以執行NORFLASH上的bootloader、內核、根文件
有些芯片有內置的FLASH芯片,如atmel系列
有些芯片需要外置FLASH芯片,如三星系列等
NOR FLASH可以片上執行應用程序,但是速度、大小都受到限制,一般在一些簡單系統中比較多
很多bootloader採用NOR FLASH中存儲、ram中運行的方式引導系統,即將bootloader燒寫在NOR FLASH中,最終還要讀入ram中運行
NAND FLASH啓動:
NAND是由東芝率先推出,得到各大廠商廣泛支持的一種大容量FLASH,在U盤、SD卡等數據存儲中大量應用
NAND FLASH與NOR FLASH不同,採用的非總線接口,不能通過總線尋址,不支持片上執行,因此需要進行一步中轉讀入SDRAM纔可以運行
SD卡啓動
FLASH必須固化在板子上,燒寫、編程需要專門的工具,因此在一些最新的CPU中,如三星的6410提供了一種新型的啓動方式,將bootloader燒入SD中,進行設備的引導與啓動
同NAND啓動類似,SD卡也不是採用總線結構,也需要進行過渡啓動
我們以S3C2440及s3c6410爲例講解以上啓動過程
S3C2440採用總線結構管理片上外設及內存,存儲器管理器提供訪問外部存儲器的所有控制信號
27位地址信號、32位數據信號、8個片選信號、以及讀/寫控制信號等
總共有8個存儲器bank(bank0—bank7)共1GB
s3c2440支持兩種啓動方式:
NOR FLASH啓動
代碼直接寫入NOR FLASH,運行時直接在NOR上運行
NAND FLASH啓動方式
代碼燒到NAND FLASH中,藉助片內4K的sram,將代碼由NAND FLASH烤到SDRAM中,在SDRAM中運行
Bootloader的啓動過程啓動過程可以分爲單階段(Single Stage)、多階段(Multi-Stage)兩種:
通常多階段的Bootloader能提供更爲複雜的功能,以及更好的可移植性
從固態存儲設備上啓動的Bootloader大多都是兩階段的啓動過程
第一階段使用匯編來實現,它完成一些依賴於 CPU體系結構的初始化,並調用第二階段的代碼
第二階段則通常使用C語言來實現,完成與體系結構無關的功能,這樣可以實現更復雜的功能,而且代碼會有更好的可讀性和可移植性
Bootloader第一階段的功能:
硬件設備初始化
屏蔽所有的中斷
設置 CPU 的速度和時鐘頻率
mem初始化:
包括正確地設置系統的內存控制器的功能寄存器以及各內存庫控制寄存器等
初始化LED或串口:
通過GPIO來驅動LED或串口,用來做調試信息輸出
拷貝Bootloader的第二階段代碼到RAM空間中
簡單NAND FLASH讀取驅動
設置好棧,爲第二階段
跳轉到第二階段代碼的C入口點
Bootloader第二階段的功能:
初始化本階段要使用到的硬件設備
MTD設備驅動初始化
uart、電源、時鐘初始化
網卡、USB設備、SD卡等設備初始化
初始化軟件環境:
堆空間的初始化
Bootloader私有數據初始化,例如vivi的mtd分區表信息、串口傳輸協議,u-boot環境變量等
提供一個命令行模式:進行下載更新等工作
將內核映像從Flash上讀到RAM空間中
調用內核
壓縮內核、非壓縮內核
在開發過程中Bootloader各功能的實現通常需要人的介入,因此bootloader需要提供一定的通信方式進行信息與數據的交換
Bootloader與主機進行信息交互:
通常會通過串口來進行信息的交互,例如:輸出打印信息到串口,從串口讀取用戶控制字符等
Bootloader與主機進行數據交互
最基本會通過串口連接,文件傳輸協議通常是xmodem/ymodem/zmodem/kermit協議中的一種
很多bootloader會提供網絡、usb、sd發等硬件設備進行大量數據的傳輸
網絡一般基於dhcp、tftp、nfs等協議,sd卡一般基於fat文件系統等