零:目的
在非開發模式下,即啟動加載模式下,uboot執行到最後,将linux的參數放在0x30000100為起始的地方,将linux核心放在0x30008000為起始的位址,然後跳轉到0x30008000處執行,剩下的就是linux的事了。
一:上電
uboot被燒寫到flash中以0x00000000為起始的地方。
開發闆硬體決定了上電後,開發闆從0x00000000處開始執行程式。
開始的幾條指令是與程式編譯時确定的位址無關的指令,做了些基本的設定後,将整個uboot代碼複制到記憶體中(以0x33f80000為起始的地方)。然後,通過一條指令:ldr pc , _start_armboot
跳轉到c語言代碼,正式使用程式編譯時确定的位址來執行程式。
二:架構
整個體系中,smdk2410開發闆的獨立檔案有:
/board/smdk2410 檔案夾
/include/config/smdk2410.h 檔案
對于不同的開發闆,類似。
其他的檔案則是通用的。
三:編譯指令
make smdk2410_config
make
得到我們想要的uboot映像。
四:配置
uboot的配置集中在 /include/config/smdk2410.h 中。
其中主要有兩類宏:
一類是選項,字首為"CONFIG_";
一類是參數,字首為"CFG_";
五:編譯連結
1.首先編譯 cpu/$(CPU)/start.S ,對于不同的CPU,還可能編譯cpu/$(CPU)下的其他檔案。
2.然後,對于開發闆相關的每個目錄,每個通用目錄都使用他們各自的Makefile生成相應的庫。
3.将1 2 步生成的 .o .a 檔案按照 board/$(BOARDDIR)/config.mk 檔案中指定的代碼段起始位址 和 board/$(BOARDDIR)/U-BOOT.lds 連結接腳本進行連結。
4.第3步得到的是ELF格式的U-Boot,後面Makefile還會将它轉換為二進制格式,S-Record格式。