轉載:http://blog.csdn.net/conowen/article/details/7253620
BIOS
BIOS是英文"Basic Input Output System"的縮略語,直譯過來后中文名稱就是"基本輸入輸出系統"。其實,它是一組固化到計算機內主板上一個ROM芯片上的程序,它保存着計算機最重要的基本輸入輸出的程序、系統設置信息、開機后自檢程序和系統自啟動程序。 其主要功能是為計算機提供最底層的、最直接的硬件設置和控制。
BootLoader
PC機中的引導加載程序由BIOS(其本質是一段固件程序)和GRUB或LILO一起組成。BIOS在完成硬件檢測和資源分配后,將硬盤中的引導程序讀到系統內存中然后將控制權交給引導程序。引導程序的主要任務是將內核從硬盤上讀到內存中,然后跳轉到內核的入口點去運行,即啟動操作系統。
BootLoader是一段小程序,可以把它想象成PC機linux上的GRUB/LILO引導程序,只不過在嵌入式linux中,沒有BIOS,而是直接從flash中運行,來裝載內核。它可以初始化硬件設備,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統做好准備。
簡單地說,BootLoader就是在操作系統運行之前運行的一段小程序。通過這段小程序,可以初始化硬件設備,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統做好准備。
一個嵌入式系統從軟件角度來看分為三個層次:
1.引導加載程序
包括固化在固化中的boot程序(可選),和BootLoader兩大部分
2.linux內核
特定於嵌入式平台的定制內核
3.文件系統
包括了系統命令和應用程序
--------------------------------------------------------------------------------
BootLoader-->Boot Parameters-->Kernel-->Root Filesystem
--------------------------------------------------------------------------------
為什么需要進行bootloader移植?
答:1.因為每種不同的CPU體系結構都有不同的BootLoader
2.BootLoader依賴於具體的嵌入式板級設備的配置
--------------------------------------------------------------------------------
BootLoader啟動過程可分為單階段和多階段(stage1、stage2),其中stage1完成初始化硬件,如CPU寄存器、內存控制器,為stage2准備內存空間。一般stage1是可以直接在nor flash中運行的,並將stage2復制到內存RAM中,設置堆棧,然后跳轉到stage2(從這也可以看出stage2是在RAM中運行的,與stage1不同)
BootLoader的stage1通常包括以下步驟:
1.硬件設備初始化 如CPU寄存器、內存控制器
2.為加載BootLoader的stage2准備RAM空間
3.拷貝BootLoader的stage2到RAM空間中
4.設置好堆棧 為什么?為了跳轉到stage2的入口,因為stage2大多數是用C語言寫的
5.跳轉到stage2的C入口點
BootLoader的stage2通常包括以下步驟:
1.初始化本階段要使用到的硬件設備 各種設備,如網卡
2.將內核映像和根文件系統映像從flash上讀到RAM中去
3.調用內核
--------------------------------------------------------------------------------
Uboot
Uboot用於多種嵌入式CPU的BootLoader程序
支持多種嵌入式操作系統的引導
UBOOT目錄結構
1.Borad 與開發板有關的文件。第一個開發板都以一個子目錄出現在當前目錄中
2.Common 實現Uboot支持的命令
3.Cpu 與特定CPU架構相關的代碼,支持的CPU對應一個子目錄(注意CPU與開發板的區別)
3.Disk 對磁盤的支持
4.Doc 文檔目錄
5.Drivers Uboot支持的設備驅動程序 如各種網卡、串品、USB、支持CFI的Flash
6.Fs 文件系統的支持
7.Iclude Uboot使用的頭文件。該目錄下configs目錄有與開發板相關的配置頭文件 該目錄下的asm目錄有與CPU體系結構相關的頭文件
8.Net 與網絡協議相關的代碼 各路協議的實現
9.Tools 生成Uboot的工具,如:mkimage,crc等等
Uboot編譯分為兩步
1.執行每種board相關的配置 如:make amdk_2420
2.編譯生成uboot.bin文件 如:make CROSS_COMPILE=arm-linux-(指定正確路徑)
u-boot終極目的就是啟動內核 。。。。分兩步
a. 從flash讀出內核UImage, 分區名不重要, 關鍵是代碼中寫死的 分區起始地址。。。
b. 啟動內核, do_bootm_linux
do_bootm_linux又分兩步,設置啟動參數,告訴內核一些參數(有一個起始地址,按固定格式寫入),跳到內核入口地址再啟動內核,內核啟動后要讀取設置的參數可以從起始地址讀取。。。