uboot學習筆記之原始碼解讀(一)
1、BootLoader介紹
對於計算機系統來說,從開機上電到作業系統啟動需要一個引導過程。嵌入式Linux系統同樣離不開載入程式,這個載入程式就叫作啟動載入程式(Bootloader)。
Bootloader是在作業系統執行之前執行的一段小程式。通過這段小程式,可以初始化硬體裝置、建立記憶體空間的對映表,從而建立適當的系統軟硬體環境,為最終呼叫作業系統核心做好準備。對於嵌入式系統,Bootloader是基於特定硬體平臺實現的。因此,幾乎不可能為所有的嵌入式系統建立一個通用的Bootloader,不同的處理器架構都有不同的Bootloader。Bootloader不但依賴於CPU的體系結構,而且依賴於嵌入式系統板級裝置的配置。
2、uboot介紹
從上述描述,我們可以知道:
(1)在裝置上電執行系統之前,需要先執行BootLoader。BootLoader為系統的執行準備好軟硬體環境(軟硬體初始化)。
(2)CPU架構、板載硬體資源任意一個不同,BootLoader程式程式碼都不同
雖然是這樣,BootLoader仍然可以通過類似窮舉一樣,將各個CPU架構原始碼都加入進來,使得整個原始碼能支援更多的硬體,uboot就是其中做得比較好的,u-boot就同時支援PowerPC、ARM、MIPS和X86等體系結構,支援的板子有上百種。
uboot原始碼實質就是一個工程,使用Makefile管理,最早是德國的DENX軟體公司的CEO:Wolfgang Denk建立,慢慢完善之後,現在u-boot已經支援PowerPC、ARM、X86、MIPS體系結構的上百種開發板,已經成為功能最多、靈活性最強,並且開發最積極的開源Bootloader。目前仍然由DENX的Wolfgang Denk維護。
3、獲取uboot原始碼方式
git原始碼庫:git://www.denx.de/git/u-boot.git
4、uboot版本號
以前老版本的uboot程式碼版本號的命名規則是:u-boot-1.3.4.tar(及其以前的版本),之後的命名是以時間為標準:
U-Boot v2009.11 - 2009年11月的版本
U-Boot v2009.11.1 - 2009年11月釋出的穩定版本1
U-Boot v2010.09-rc1 - 2010年9月釋出的候選版本1
5、原始碼結構
以最新的u-boot-2018.09-rc2為例:
/arch Architecture specific files
/arc Files generic to ARC architecture
/arm Files generic to ARM architecture
/m68k Files generic to m68k architecture
/microblaze Files generic to microblaze architecture
/mips Files generic to MIPS architecture
/nds32 Files generic to NDS32 architecture
/nios2 Files generic to Altera NIOS2 architecture
/openrisc Files generic to OpenRISC architecture
/powerpc Files generic to PowerPC architecture
/riscv Files generic to RISC-V architecture
/sandbox Files generic to HW-independent "sandbox"
/sh Files generic to SH architecture
/x86 Files generic to x86 architecture
/api Machine/arch independent API for external apps
/board Board dependent files
/cmd U-Boot commands functions
/common Misc architecture independent functions
/configs Board default configuration files
/disk Code for disk drive partition handling
/doc Documentation (don't expect too much)
/drivers Commonly used device drivers
/dts Contains Makefile for building internal U-Boot fdt.
/examples Example code for standalone applications, etc.
/fs Filesystem code (cramfs, ext2, jffs2, etc.)
/include Header Files
/lib Library routines generic to all architectures
/Licenses Various license files
/net Networking code
/post Power On Self Test
/scripts Various build scripts and Makefiles
/test Various unit test files
/tools Tools to build S-Record or U-Boot images, etc.
第1類目錄與處理器體系結構或開發板硬體直接相關。
第2類目錄是一些通用的函式或驅動程式。
第3類目錄是u-boot的應用程式、工具或文件。
6、uboot原始碼配置
uboot原始碼配置主要由兩種方式:手動Makefile配置和圖形化介面配置。其中手動Makefile配置的基本原理就是:執行make 板子名稱_defconfig。注意,是否能夠執行相關預設配置設定,主要還是看uboot原始碼是否有支援的配置檔案,如果沒有,檢視原始碼doc/README.scrapyard檔案,看看裡面有沒有你使用的晶片型號,如果有,那麼就是不支援了。
第二種圖形化介面配置,就是和核心原始碼配置一樣,使用make menuconfig命令,使用圖形化介面去配置。
7、uboot編譯配置
u-boot的原始碼是通過GNU Makefile組織編譯的。頂層目錄下的Makefile完成對開發板的整體配置,然後遞迴呼叫各級子目錄下的Makefile,最後把所有編譯過的程式連結成u-boot映像。
(1)配置編譯流程:
make <board_name>_deconfig //board_name用具體的開發板SOC名稱替換,完成編譯配置
make //執行編譯uboot流程
(2)頂層Makefile檔案
當執行make <board_name>_defconfig的時候,實際上執行的結果就是在Include目錄下生成config.mk的Makefile配置檔案,其中的內容就是制定編譯uboot時候的資訊:ARCH、CPU、BOARD、VENDOR、SOC等,以S3C2410為例:
ARCH = arm
CPU = arm920t
BOARD = smdk2410
VENDOR = samsung
SOC = s3c24x0
這樣硬體平臺依賴的目錄檔案可以根據這些定義來確定。SMDK2410平臺相關目錄如下:
board/samsung/smdk2410/
cpu/arm920t/
cpu/arm920t/s3c24x0/
lib_arm/
include/asm-arm/
include/configs/smdk2410.h
再回到頂層目錄的Makefile檔案開始的部分,其中下列幾行包含了對前面所述變數的定義。
# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export ARCH CPU BOARD VENDOR SOC
Makefile的編譯選項和規則在頂層目錄的config.mk檔案中定義。各種體系結構通用的規則直接在該檔案中定義。通過ARCH、CPU、BOARD、SOC等變數為不同硬體平臺定義不同選項。不同體系結構的規則分別包含在各自的lib_xxx(xxx表示體系架構,如lib_arm)目錄下的config.mk檔案中。
(3)開發板配置標頭檔案
除了編譯頂層Makefile以外,還要在移植時為開發板定義配置選項或引數。這個標頭檔案是include/configs/<board_name>.h。<board_name>用相應的BOARD定義代替。
這些標頭檔案中定義的選項或引數巨集以CONFIG_為字首,用來選擇處理器、裝置介面、命令、屬性等。例如:
#define CONFIG_ARM920T 1
#define CONFIG_DRIVER_CS8900 1
8、 編譯結果
編譯完成後,可以得到u-boot各種格式的映像檔案和符號表:
檔名稱 | 功能說明 |
---|---|
system.map | uboot映象的符號表 |
uboot | uboot映象的ELF格式 |
uboot.bin | boot映象的二進位制格式 |
uboot.srec | uboot映象的S-Record格式 |
u-boot的3種映像格式都可以燒寫到Flash中,但需要看載入器能否識別這些格式。一般u-boot.bin最為常用,直接按照二進位制格式下載,並且按照絕對地址燒寫到Flash中即可。
9、uboot工具
在tools目錄下會生成u-boot工具,這些工具有時也經常用到:
工具名稱 | 功能說明 | 工具名稱 | 功能說明 |
---|---|---|---|
bmp_logo | 製作logo的點陣圖結構體 | img2srec | 轉換S_Record格式映象 |
envcrc | 校驗uboot內部的環境變數 | mkiamge | 製作uImage格式映象 |
get_eth_addr | 生成乙太網介面MAC地址 | updater | uboot自動更新升級工具 |
這些工具都有原始碼,可以參考改寫它們。其中mkimage是很常用的一個工具,Linux的核心映象和initramfs檔案系統映像都可以用該工具轉換成u-boot所需的格式。
參考資料:《深度實踐嵌入式Linux系統移植 》 範展源 劉韜著