u-boot是一種普遍用於嵌入式系統中的Bootloader,Bootloader是在作業系統執行之前執行的一小段程式,透過它,我們可以初始化硬體裝置、建立記憶體空間的對映表,從而建立適當的軟硬體環境,為最終呼叫作業系統核心做好準備。Boot Loader的主要執行任務就是將核心映象從硬碟上讀到RAM中,然後跳轉到核心的入口點去執行,即開始啟動作業系統。系統在上電或復位時通常都從地址0x00000000處開始執行,而在這個地址處安排的通常就是系統的Boot Loader程式。 u-boot目錄結構: 1、board中存放於開發板相關的配置檔案,每一個開發板都以子資料夾的形式出現; 2、Commom資料夾實現u-boot行下支援的命令,每一個命令對應一個檔案; 3、cpu中存放特定cpu架構相關的目錄,每一款cpu架構都對應了一個子目錄; 4、Doc是文件目錄,有u-boot非常完善的文件; 5、Drivers中是u-boot支援的各種裝置的驅動程式; 6、Fs是支援的檔案系統,其中最常用的是JFFS2檔案系統; 7、Include資料夾是u-boot使用的標頭檔案,還有各種硬體平臺支援的彙編檔案,系統配置檔案和檔案系統支援的檔案; 8、Net是與網路協議相關的程式碼,bootp協議、TFTP協議、NFS檔案系統得實現; 9、Tooles是生成U-boot的工具。 其中比較重要的目錄就是/board、/cpu、/drivers和 /include目錄,如果想實現u-boot在一個平臺上的移植,就要對這些目錄進行深入的分析。 u-boot的啟動過程: 系統啟動的入口點。既然我們現在要分析u-boot的啟動過程,就必須先找到u-boot最先實現的是哪些程式碼,最先完成的是哪些任務。另一方面一個可執行的image必須有一個入口點,並且只能有一個全域性入口點,所以要通知編譯器這個入口在哪裡。由此我們可以找到程式的入口點是在/board /lpc2210/u-boot.lds中指定的,其中ENTRY(_start)說明程式從_start開始執行,而他指向的是cpu /arm7tdmi/start.o檔案。因為我們用的是ARM7TDMI的cpu架構,在復位後從地址0x00000000取它的第一條指令,所以我們將Flash對映到這個地址上,這樣在系統加電後,cpu將首先執行u-boot程式。 u-boot的啟動過程是多階段實現的,分了兩個階段: 第一階段是用匯編寫的,主要任務是: 1、CPU 自身初始化:包括MMU,Cache,時鐘系統,SDRAM 控制器等的初始化; 2、重定位:把自己從非易失性儲存器搬移到 RAM 中; 3、分配堆疊空間,設定堆疊指標; 4、清零 BSS 資料段; 5、跳轉到第二階段入口函式 start_armboot(); 第二階段是用C寫的,主要任務是: 1、為 U-boot 內部私有資料分配儲存空間,並清零; 2、依次呼叫函式指標陣列 init_sequence 中定義的函式進行一系列的初始化; 3、如果系統支援 NOR Flash,呼叫flash_init ()和display_flash_config ()初始化並顯示檢測到的器件資訊; 4、如果系統支援 LCD 或VFD,呼叫lcd_setmem()或vfd_setmem()計算幀緩(Framebuffer)大小,然後在BSS 資料段之後為Framebuffer 分配空間,初始化gd->fb_base 為Framebuffer 的起始地址; 5、呼叫 mem_malloc_init()進行儲存分配系統(類似於C 語言中的堆)的初始化和空間分配; 6、如果系統支援 NAND Flash,呼叫nand_init ()進行初始化; 7、如果系統支援 DataFlash,呼叫AT91F_DataflashInit()和dataflash_print_info()進行初始化並顯示檢測到的器件資訊; 8、呼叫 env_relocate ()進行環境變數的重定位,即從Flash 中搬移到RAM 中; 9、如果系統支援 VFD,呼叫drv_vfd_init()進行VFD 裝置初始化; 10、從 環 境 變 量 中 讀 取 IP 地址和MAC 地址, 初始化gd->bd-> bi_ip_addr 和gd->bd->bi_enetaddr; 11、呼叫 jumptable_init ()進行跳轉表初始化,跳轉表在global_data 中,具體用途尚不清楚; 12、呼叫 console_init_r()進行控制檯初始化; 13、如果需要,呼叫 misc_init_r ()進行雜項初始化; 14、呼叫 enable_interrupts ()開啟中斷; 15、如果需要,呼叫board_late_init()進行單板後期初始化,對於AT91SAM9260EK,主要是乙太網初始化; 16、進入主迴圈:根據使用者的選擇啟動 linux,或者進入命令迴圈執行使用者輸入的命令; 這部分是一些相對變化不大的部分,我們針對不同的板子改變它呼叫的一些初始化函式,並且透過設定一些宏定義來改變初始化的流程,所以這些程式碼在移植的過程中並不需要修改,也是錯誤相對較少出現的檔案。在檔案的開始先是定義了一個函式指標陣列,透過這個陣列,程式透過一個迴圈來按順序進行常規的初始化,並在其後透過一些宏定義來初始化一些特定的裝置。在最後程式進入一個迴圈,main_loop。這個迴圈接收使用者輸入的命令,以設定引數或者進行啟動引導。
u-boot是一種普遍用於嵌入式系統中的Bootloader,Bootloader是在作業系統執行之前執行的一小段程式,透過它,我們可以初始化硬體裝置、建立記憶體空間的對映表,從而建立適當的軟硬體環境,為最終呼叫作業系統核心做好準備。Boot Loader的主要執行任務就是將核心映象從硬碟上讀到RAM中,然後跳轉到核心的入口點去執行,即開始啟動作業系統。系統在上電或復位時通常都從地址0x00000000處開始執行,而在這個地址處安排的通常就是系統的Boot Loader程式。 u-boot目錄結構: 1、board中存放於開發板相關的配置檔案,每一個開發板都以子資料夾的形式出現; 2、Commom資料夾實現u-boot行下支援的命令,每一個命令對應一個檔案; 3、cpu中存放特定cpu架構相關的目錄,每一款cpu架構都對應了一個子目錄; 4、Doc是文件目錄,有u-boot非常完善的文件; 5、Drivers中是u-boot支援的各種裝置的驅動程式; 6、Fs是支援的檔案系統,其中最常用的是JFFS2檔案系統; 7、Include資料夾是u-boot使用的標頭檔案,還有各種硬體平臺支援的彙編檔案,系統配置檔案和檔案系統支援的檔案; 8、Net是與網路協議相關的程式碼,bootp協議、TFTP協議、NFS檔案系統得實現; 9、Tooles是生成U-boot的工具。 其中比較重要的目錄就是/board、/cpu、/drivers和 /include目錄,如果想實現u-boot在一個平臺上的移植,就要對這些目錄進行深入的分析。 u-boot的啟動過程: 系統啟動的入口點。既然我們現在要分析u-boot的啟動過程,就必須先找到u-boot最先實現的是哪些程式碼,最先完成的是哪些任務。另一方面一個可執行的image必須有一個入口點,並且只能有一個全域性入口點,所以要通知編譯器這個入口在哪裡。由此我們可以找到程式的入口點是在/board /lpc2210/u-boot.lds中指定的,其中ENTRY(_start)說明程式從_start開始執行,而他指向的是cpu /arm7tdmi/start.o檔案。因為我們用的是ARM7TDMI的cpu架構,在復位後從地址0x00000000取它的第一條指令,所以我們將Flash對映到這個地址上,這樣在系統加電後,cpu將首先執行u-boot程式。 u-boot的啟動過程是多階段實現的,分了兩個階段: 第一階段是用匯編寫的,主要任務是: 1、CPU 自身初始化:包括MMU,Cache,時鐘系統,SDRAM 控制器等的初始化; 2、重定位:把自己從非易失性儲存器搬移到 RAM 中; 3、分配堆疊空間,設定堆疊指標; 4、清零 BSS 資料段; 5、跳轉到第二階段入口函式 start_armboot(); 第二階段是用C寫的,主要任務是: 1、為 U-boot 內部私有資料分配儲存空間,並清零; 2、依次呼叫函式指標陣列 init_sequence 中定義的函式進行一系列的初始化; 3、如果系統支援 NOR Flash,呼叫flash_init ()和display_flash_config ()初始化並顯示檢測到的器件資訊; 4、如果系統支援 LCD 或VFD,呼叫lcd_setmem()或vfd_setmem()計算幀緩(Framebuffer)大小,然後在BSS 資料段之後為Framebuffer 分配空間,初始化gd->fb_base 為Framebuffer 的起始地址; 5、呼叫 mem_malloc_init()進行儲存分配系統(類似於C 語言中的堆)的初始化和空間分配; 6、如果系統支援 NAND Flash,呼叫nand_init ()進行初始化; 7、如果系統支援 DataFlash,呼叫AT91F_DataflashInit()和dataflash_print_info()進行初始化並顯示檢測到的器件資訊; 8、呼叫 env_relocate ()進行環境變數的重定位,即從Flash 中搬移到RAM 中; 9、如果系統支援 VFD,呼叫drv_vfd_init()進行VFD 裝置初始化; 10、從 環 境 變 量 中 讀 取 IP 地址和MAC 地址, 初始化gd->bd-> bi_ip_addr 和gd->bd->bi_enetaddr; 11、呼叫 jumptable_init ()進行跳轉表初始化,跳轉表在global_data 中,具體用途尚不清楚; 12、呼叫 console_init_r()進行控制檯初始化; 13、如果需要,呼叫 misc_init_r ()進行雜項初始化; 14、呼叫 enable_interrupts ()開啟中斷; 15、如果需要,呼叫board_late_init()進行單板後期初始化,對於AT91SAM9260EK,主要是乙太網初始化; 16、進入主迴圈:根據使用者的選擇啟動 linux,或者進入命令迴圈執行使用者輸入的命令; 這部分是一些相對變化不大的部分,我們針對不同的板子改變它呼叫的一些初始化函式,並且透過設定一些宏定義來改變初始化的流程,所以這些程式碼在移植的過程中並不需要修改,也是錯誤相對較少出現的檔案。在檔案的開始先是定義了一個函式指標陣列,透過這個陣列,程式透過一個迴圈來按順序進行常規的初始化,並在其後透過一些宏定義來初始化一些特定的裝置。在最後程式進入一個迴圈,main_loop。這個迴圈接收使用者輸入的命令,以設定引數或者進行啟動引導。