Linux嵌入式 -- Bootloader , Uboot
1. Bootloader作用
PC機中的引導加載程序由BIOS(其本質是一段固件程序)和GRUB或LILO一起組成。BIOS在完成硬件檢測和資源分配后,將硬盤中的引導程序讀到系統內存中然后將控制權交給引導程序。引導程序的主要任務是將內核從硬盤上讀到內存中,然后跳轉到內核的入口點去運行,即啟動操作系統。
簡單地說,BootLoader就是在操作系統運行之前運行的一段小程序。通過這段小程序,可以初始化硬件設備,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統做好準備。
系統加電或復位后,所有的CPU通常都從CPU制造商預先安排地址開始執行。比如,S3C2410在復位后從地址0x00000000起開始執行。而嵌入式系統則將固態存儲設備(比如:FLASH)安排在這個地址上,而bootloader程序又安排在固態存儲器的最前端,這樣就能保證在系統加電后,CPU首先執行BootLoader程序。
2. Bootloader 移植
每種不同的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又分兩步,設置啟動參數,告訴內核一些參數(有一個起始地址,按固定格式寫入),跳到內核入口地址再啟動內核,內核啟動后要讀取設置的參數可以從起始地址讀取。。。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Linux嵌入式 -- Bootloader , Uboot的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: U-Boot启动过程完全分析
- 下一篇: C/C++:程序的内存分配方式