Bootloader,簡而言之就是:它是一段小程式,在系統上電時開始執行,主要功能是初始化硬體裝置、準備好軟體環境,最後叫用作業系統核心。
Bootloader種類比較多,常見的X86上的有LILO,GRUB,ARM架構上比較有名的是U-boot,VIVI. 還有其他的RedBoot / Etherboot等
啟動Bootloader指令地址(ARM結構的cpu一般放在0x0000000地址處,而MIPS結構的CPU一般放在0xBFC00000)
Bootloader常見兩種操作模式:1。啟動載入模式(沒使用者介入) 2.下載模式(使用者命令操作)
Bootloader中典型分區結構圖:
*Bootloader上電後第一個程式。
*Boot parameters分區中一般存放一些可設定的參數,比如IP地址、串口傳輸速率,要傳遞給核心的命令列參數。
*kernel,嵌入式板定製的核心,包含核心啟動參數
*Root filesystem檔案系統,裡麵包含了linux能夠啟動並執行應用程式,和相關庫等。
@Bootloader的兩個階段瞭解
1.第一階段(使用組合語言實現,依賴於cpu體繫結構的初始化)
。硬體初始化(看門狗、RAM初始化等)
。為載入Bootloader的第二階段代碼準備RAM空間
。複製Bootloader的第二階段代碼到RAM空間中
。設定好棧
。調轉到第二階段代碼的進入點
2.第二階段(通常C語言實現,好處可讀性和移植性)
。初始化本階段要用到的硬體裝置
。檢測系統記憶體映射(memory map)
。將核心映像和根檔案系統系統映像從Flash讀到RAM記憶體中
。為核心設定啟動參數
@Bootloader與核心互動
Bootloader和核心互動是單向的,因為它們啟動有先後。
Bootloader傳遞參數給核心,有書說明:linux2.4.x後都是以資料結構:標記列表形式來傳遞啟動參數。
標記的資料結構為tag,由tag_header結構和 一個聯合union組成。如下:
struct tag_header { __u32 size; __u32 tag;};
struct tag_mem32 {__u32size;__u32start;/* physical start address */};
struct tag {struct tag_header hdr;union {struct tag_corecore;struct tag_mem32mem; //記憶體標記struct tag_videotextvideotext;struct tag_ramdiskramdisk;struct tag_initrdinitrd;struct tag_serialnrserialnr;struct tag_revisionrevision;struct tag_videolfbvideolfb;struct tag_cmdlinecmdline;/* * Acorn specific */struct tag_acornacorn;/* * DC21285 specific */struct tag_memclkmemclk;} u;};