1. 程式人生 > >uboot學習筆記之原始碼解讀(一)

uboot學習筆記之原始碼解讀(一)

1、BootLoader介紹

對於計算機系統來說,從開機上電到作業系統啟動需要一個引導過程。嵌入式Linux系統同樣離不開載入程式,這個載入程式就叫作啟動載入程式(Bootloader)。

Bootloader是在作業系統執行之前執行的一段小程式。通過這段小程式,可以初始化硬體裝置、建立記憶體空間的對映表,從而建立適當的系統軟硬體環境,為最終呼叫作業系統核心做好準備。對於嵌入式系統,Bootloader是基於特定硬體平臺實現的。因此,幾乎不可能為所有的嵌入式系統建立一個通用的Bootloader,不同的處理器架構都有不同的Bootloader。Bootloader不但依賴於CPU的體系結構,而且依賴於嵌入式系統板級裝置的配置。

對於兩塊不同的嵌入式板而言,即使它們使用同一種處理器,要想讓執行在一塊板子上的Bootloader程式也能執行在另一塊板子上,一般都需要修改Bootloader的源程式。

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系統移植 》 範展源 劉韜著