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