Linux嵌入式 -- Bootloader , Uboot

1. Bootloader做用前端

PC機中的引導加載程序由BIOS(其本質是一段固件程序)和GRUB或LILO一塊兒組成。BIOS在完成硬件檢測和資源分配後,將硬盤中的引導程序讀到系統內存中而後將控制權交給引導程序。引導程序的主要任務是將內核從硬盤上讀到內存中,而後跳轉到內核的入口點去運行,即啓動操做系統。
linux

簡單地說,BootLoader就是在操做系統運行以前運行的一段小程序。經過這段小程序,能夠初始化硬件設備,從而將系統的軟硬件環境帶到一個合適的狀態,以便爲最終調用操做系統作好準備
shell

系統加電或復位後,全部的CPU一般都從CPU製造商預先安排地址開始執行。好比,S3C2410在復位後從地址0x00000000起開始執行。而嵌入式系統則將固態存儲設備(好比:FLASH)安排在這個地址上,而bootloader程序又安排在固態存儲器的最前端,這樣就能保證在系統加電後,CPU首先執行BootLoader程序。
小程序




2. Bootloader 移植spa

每種不一樣的CPU體系結構都有不一樣的BootLoader。除了依賴於CPU的體系結構外,BootLoader 還依賴於具體的嵌入式板級設備的配置,好比板卡的硬件地址分配,外設芯片的類型等。這也就是說,對於兩塊不一樣的開發板而言,即便它們是基於同一種CPU而構建的,但若是他們的硬件資源或配置不一致的話,要想在一塊開發板上運行的BootLoader程序也能在另外一塊板子上運行,仍是須要做修改。
操作系統


3. 移植流程內存

BootLoader 的啓動過程可分爲單階段(Single-Stage)和多階段(Multi-Stage)兩種。
資源

BootLoader 大多采用兩階段,即啓動過程能夠分爲 stage1和 stage2:stage1完成初始化硬件,爲stage2準備內存空間,並將stage2複製到內存中,設置堆棧,而後跳轉到stage2
開發

Stage1:(彙編編寫)源碼

     ·硬件設備初始化(主要是CPU內部器件)
     ·爲加載 BootLoader 的 stage2 準備 RAM 空間
     ·拷貝 BootLoader 的 stage2 到 RAM 空間中
     ·設置好堆棧(why??)  
     ·跳轉到 stage2 的 C 入口

Stage2:(C編寫)

    ·初始化本階段要使用到的硬件設備(主要是外設)
    ·將內核映像和根文件系統映像從 flash 上讀到RAM 中
    ·調用內核




4. Uboot介紹

下載地址: ftp://ftp.denx.de/pub/u-boot/

文件目錄介紹



5. Uboot編譯

    1. make mini6410_nand_config-ram256

    2. make CROSS_COMPILE=arm-linux-

詳解:

mini6410_nand_config-ram256 :  unconfig
@$(MKCONFIG) mini6410 arm s3c64xx mini6410 samsung s3c6410 NAND ram256

實際運行的是 ./mkconfig mini6410 arm s3c64xx mini6410 samsung s3c6410 NAND ram256 (8個參數)

查看mkconfig源碼(實際爲shell腳本), 配置成功後 在 ../include/  下生成config.mk 和 config.h 爲編譯時使用。


編譯註意兩步 :

a. 鏈接地址 ../board/samsung/mini6410/u-boot.lds(連接文件)   +   config.mk 裏面的偏移地址(根據flash大小定地址)TEXT_BASE = 0xc7e00000

b. ../cpu/s3c64xx/start.S



命令實現: ../common/main.c   目錄../common/ 有各類命令實現源碼。。。


u-boot終極目的就是啓動內核 。。。。分兩步

a. 從flash讀出內核UImage, 分區名不重要, 關鍵是代碼中寫死的 分區起始地址。。。

b. 啓動內核, do_bootm_linux

do_bootm_linux又分兩步,設置啓動參數,告訴內核一些參數(有一個起始地址,按固定格式寫入),跳到內核入口地址再啓動內核,內核啓動後要讀取設置的參數能夠從起始地址讀取。。。

相關文章
相關標籤/搜索