嵌入式Linux開發——(十一)u-boot原始碼分析
1、U-Boot的特性:
①開放原始碼
②支援多種嵌入式作業系統核心:Linux、NetBSD、VxWorks、QNx、RTEMS、ARTOS、 LynxOS
③支援多種架構的CPU:PowerPC、ARM、x86、MIPS、XScale
④豐富的裝置驅動原始碼,如:串列埠、乙太網、SDRAM、Flash等
⑤支援的目標板環境變數多種儲存方式:Flash、EEPROM、RAM
⑥CRC32檢驗,檢驗Flash中核心,RAMDISK映象是否損壞
⑦上電自檢功能:SDRAM、FLASH大小檢測、故障檢測,CPU型號
⑧特殊功能:XIP核心引導
獲取最新U-Boot網址:http://sourceforge.net/project/U-Boot
2、U-Boot原始碼結構(基於U-Boot-1.1.6)
1)U-Boot-1.1.6根目錄下共有26個子目錄,可分為4類
①平臺相關的或開發板相關的
②通用的函式
③通用裝置驅動程式
④U-Boot工具示例程式、文件
相應資料夾:
2)“CONFIG_”除了設定一些引數外,主要用來設定U-Boot的功能,選擇使用檔案的哪一部分。而“CFG_”用來設定細節的參 數。
3、U-Boot編譯流程
4、U-Boot的啟動過程原始碼分析
1)U-Boot第一階段程式碼分析
檔案:cpu/arm920t/start.S 和 board/smdk2410/lowlevel_init.S
①硬體裝置初始化:設定為管理模式(SVC)、關閉WATCHDOG、設定時鐘、 關閉MMU、CACHE
②為載入Bootloader的第二階段程式碼尊卑RAM空間:初始化記憶體晶片,使它使能
③複製整個U-Boot程式碼到SDRAM空間中
④設定好棧
棧的設定靈活性很大,只要讓SP暫存器指向一段沒有被使用的記憶體即可。
⑤跳轉到第二階段程式碼的C入口點
在跳轉之前,還要清楚BSS段(初始值為0,無初始值的全域性變數、靜態變數)。
2)U-Boot第二階段程式碼分析
檔案:Lib_arm/board.c 中 start_armboot函式開始。
①初始化本階段用到的硬體裝置
最主要是設定系統時鐘、初始化串列埠。
②檢測系統記憶體對映(memory map)
③U-Boot命令的格式
即使是核心的啟動,也是通過U-Boot命令來實現的,U-Boot中每個命令都是通過U_BOOT_CMD巨集來定義。
U_BOOT_CMD(name, maxargs, repetable, command, “usage”, “help”)
④為核心設定啟動引數
Boot通過標記列表向核心傳遞引數。