2012-01-30

U-Boot 啟動流程與架構

u-boot系統啟動流程

大多數bootloader都分為stage1和stage2兩大部分,u-boot也不例外。依賴於CPU體系結構的代碼(如設備初始化代碼等) 通常都放在stage1,且可以用彙編語言來實現,而stage2則通常用C語言來實現,這樣可以實現複雜的功能,而且有更好的可讀性和移植性。


stage1 (start.s代碼結構)

u-boot的stage1代碼通常放在start.s文件中,它用彙編語言寫成,其主要代碼部分如下:(1) 定義入口由於一個可執行的Image必須有一個入口點,並且只能有一個全局入口,通常這個入口放在ROM(Flash) 的0x0地址,因此,必須通知編譯器以使其知道這個入口,該工作可通過修改連接器腳本來完成。(2) 設置異常向量(Exception Vector) 。(3) 設置CPU的速度、時鐘頻率及中斷控制寄存器。  (4) 初始化內存控制器  (5) 將ROM中的程序複製到RAM中。  (6) 初始化堆棧(7) 轉到RAM中執行,該工作可使用指令ldr pc來完成。 


stage2 C語言代碼部分

lib_arm/board.c中的start_armboot是C語言開始的函數,也是整個啟動代碼中C語言的主函數,同時還是整個u-boot(armboot) 的主函數,該函數主要完成如下操作:  (1) 調用一系列的初始化函數。  (2) 初始化Flash設備。  (3) 初始化系統內存分配函數。(4) 如果目標系統擁有NAND設備,則初始化NAND設備。(5) 如果目標系統有顯示設備,則初始化該類設備。(6) 初始化相關網絡設備,填寫IP、MAC地址等。(7) 進入命令循環(即整個boot的工作循環) ,接受用戶從串口輸入的命令,然後進行相應的工作。


目錄名稱說明
board包含所有已建立完成之開發板,與硬體相關之檔案,比如Makefile和u-boot.lds等都和具體開發板的硬體和地址分配有關。
common與系統架構無關的檔案,包含環境變數的設定與執行遠端控制台各種命令的處理等。
cpuCPU相關檔案,其中的子目錄都是以U-Boot所支援的CPU為名,比如有子目錄arm926ejs、mips、mpc8260和nios等,每個特定的子目錄中都包括cpu.c和interrupt.c,start.S。其中cpu.c初始化CPU、設置指令(Instruction) Cache和資料(Data) Cache等;interrupt.c設置系統的各種中斷和異常/特殊事件(Exception),比如快速中斷、開關中斷、時鐘中斷、軟體中斷、預取中止和未定義指令等;start.S是U-Boot啟動時執行的第一個檔案,它主要是設定系統堆疊(Stack)和工作方式,為進入C程式作好前置作業。
disk磁碟驅動與分區處理(partition handling)相關的程式碼。
doc相關說明文件。
drivers各種硬體設備驅動程式(Device Driver),比如各種網路卡、支援CFI的Flash、串列埠(Serial Port)和USB等。
dtt處理與溫度設備相關的控制。
examples一些應用範例,例如:hello_world.c、sched.c等。
fs與所支援檔案系統有關之原始程式,U-Boot現在支援cramfs、fat、fdos、jffs2和registerfs。
include檔頭定義檔(.h),還有對各種硬體平台支援的組合語言檔(.asm),定義系統的各種配置,包含軟體與硬體。
lib_xxx與各種不同架構相關的函式庫或程式碼。(lib_arm、lib_mips、lib_i386、lib_m68k等)。
lib_generic公用的程式庫(Library),例如:crc32.c(CRC Check)、zlib.c(壓縮)、string.c(字串處理)等。
net處理與網絡有關之相關程式,BOOTP協定(Protocol)、TFTP協定、RARP協定和NFS檔案統的實現。
post提供Power On Self Test功能。
rtcReal Time Clock驅動程式。
tools提供建立S-Record或U-Boot映像檔等工具程式。