Bootloader的啟動流程一般分為兩個階段:stage1和stage2,下面分別對這兩個階段進行講解:
1.stage1
(1)完成基本的硬體初始化。初始化的工作主要包括屏蔽所有的中斷、設定CPU的速度和時鐘頻率、RAM初始化、初始化LED、關閉CPU內部指令和資料cache等。
(2)為載入stage2準備RAM空間。為了更快執行速度,通常把stage2載入到RAM空間中來執行,因此必須為載入Bootloader的stage2準備一段可用的RAM空間範圍。
(3)拷貝stage2到RAM中。確定stage2的可執行映像在固態存放裝置的存放起始地址和終止地址以及RAM空間的起始地址。
(4)設定堆棧指標sp。這是為執行stage2的C語言代碼做好準備。
2.stage2
(1)用組合語言跳轉到main入口函數
(2)為了實現更複雜的功能和取得更好的代碼可讀性和可移植性,stage2的代碼通常用C語言來實現。在編譯和連結bootloader時,不能使用glibc庫中的任何支援函數。
(3)初始化串口、初始化計時器等硬體裝置。在初始化這些裝置之前、可以輸出一些列印資訊。
(4)檢測系統的記憶體映射,所謂記憶體映射就是指在整個4GB物理地址空間中有指出哪些位址範圍被分配用來定址系統的RAM單元。
(5)載入核心映像和根檔案系統映像,這裡包括規劃記憶體佔用的布局和從Flash上拷貝資料。
(6)設定核心的啟動參數。
U-Boot的目錄及存放原則
board
和一些已有開發板有關的檔案,比如Makefile和U-Boot.lds等都和具體開發板的硬體和地址分配有關。
common
與體繫結構無關的檔案,實現各種命令的C檔案
cpu
CPU相關的檔案,其中的子目錄都是以U-Boot所支援的CPU為名,比如有子目錄arm926ejs、mips、mpc8260和nios等,每個特定的子目錄都包括cpu.c和interrupt.c,start.S。其中cpu.c初始化CPU、設定指令Cache和資料Cache等;interrupt.c設定系統的各種中斷和異常,比如開關中斷、時鐘中斷、軟體中斷、預取中止和未定義指令等;start.S是U-Boot啟動時執行的第一個檔案,它主要設定系統堆棧和工作方式,為i進入C程式奠定基礎。
disk
disk驅動的分區處理代碼
doc
文檔
drivers
通用裝置驅動程式,比如各種網卡,支援CFI的Flash,串口和USB匯流排等
fs
支援檔案系統的檔案,U-Boot現在支援cramfs、fat、fdos、jffs2和registerfs
include
標頭檔、對各種硬體平台支援的彙編檔案、系統的設定檔和對檔案系統支援的檔案
net
與網路有關的代碼,如BOOTP協議,TFTP協議、RARP協議和NFS檔案系統的實現
lib_arm
與ARM體繫結構相關的代碼
tools
建立S-Record格式檔案和U-Boot images的工具