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組成。如下: