Bootloader概述
Bootloader概述
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文件系統等
總結
以上是生活随笔為你收集整理的Bootloader概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mtd
- 下一篇: uboot 分析之 启动流程