U-BOOT啟動大致流程
針對U-BOOT的分析,首先從連結檔案開始,這是針對編譯過的,沒有編譯過的,則直接從start.S檔案開始,這裡以u-boot-2009.11為例,對於S3C2440A來說,其核心是arm920t,所以其檔案位置位於cpu\arm920t\start.S
1. start.S最先執行的是start_code函式,此函式原始碼中,有如下動作
1.1 將CPU設定成SVC32模式
1.2 關閉看門狗、關中斷、設定時鐘分頻係數,這三部分一般會放到與板級相關的初始化檔案lowlevel_init.S中,位置:board\samsung\smdk2410\lowlevel_init.S
1.3 CPU初始化,關閉MMU、caches
1.4 跳轉到lowlevel_init.S檔案中的lowlevel_init函式,位置:board\samsung\smdk2410\lowlevel_init.S
2.lowlevel_init.S檔案中的lowlevel_init函式對記憶體控制器進行初始化,然後再返回到start.S中,接著後面的動作
3. 記憶體初始化後,返回到start.S中動作如下
3.1 將U-BOOT重定向到記憶體中執行,即複製到記憶體中去
3.2 對棧進行初始化
3.3 清BSS段
3.4 跳轉到board.c檔案中的start_armboot函式,位置:lib_arm\board.c
4.board.c檔案中的start_armboot函式大致做如下動作
4.1 NOR FLASH、NAND FLASH、串列埠、網絡卡、MMC等初始化,這些都是與具體的CPU、板上的器件強相關的初始化
4.2 跳轉到main.c檔案中的main_loop函式,位置:common\main.c
5.main.c檔案中的main_loop函式大致做如下動作
5.1 設定啟動次數、Modem功能、版本號、啟動延時等
5.2 迴圈讀取使用者輸入資訊,執行相應操作
其檔案的跳轉流程是start.S-->lowlevel_init.S-->start.S-->board.c-->main.c