code style

2019年7月15日 星期一

Bootloader

embedded linux system上, software可分4個層次:
1. 引導加載程序:
是系統上電後運行的第一段code。包括在firmware中的boot code(option)和bootloader兩部分
2.kernel:
包括訂製kernel和啟動參數
3.rootfs:
位於flash上的rootfs.通常用ramdisk來作為rootfs.
4.application:
實際上板子上開發應用的程式

x86主機:
引導加載程序由BIOS(位於flash rom)和位於硬碟的MBR中的OS BootLooader組成(GRUB,LILO..)
系統上電後運行BIOS => 硬體檢測,資源分配 => 將MBR中的 BootLooader由硬碟讀到ram=>
將控制權交給OS BootLoader

embedded linux system的boot loader:
而在嵌入式系統中,通常並沒有像BIOS那樣的程式(注,有的嵌入式CPU也會內嵌一段短小的啟動程序),因此整個系統的加載啟動任務就完全由BootLoader來完成.

比如在一個基於ARM7TDMI core的嵌入式系統中,系統在上電或複位時通常都從地址0x00000000處開始執行,而在這個地址處安排的通常就是系統的BootLoader程序.

簡單地說,BootLoader就是在kernel運行之前運行的一段小程序.通過這段小程序,我們可以初始化硬體設備、建立內存空間的映射圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終調用kernel准備好正確的環境.

啟動過程:
可分為Single Stage和Multi-Stage, 一般flash上使用的是Multi-Stage. 大多是stage1和stage2.
stage1:
硬體設備initial
RAM空間 inital
copy BootLoader 的stage2 到RAM空間中
設置好stack point(sp)
跳轉到stage2的 c entry point

stage2:
硬體設備initial
檢測memory map
將kernel和rootfs從flash中讀到RAM
為kernel設置啟動參數
調用kernel