嵌入式系統之bootloader簡介

轉載:https://blog.csdn.net/Set_Mode/article/details/91049861 

目錄

Bootloader 介紹

什麼是Bootloader

Bootloader的特點

Bootloader的操作模式

常用bootloader介紹

​U-boot介紹

U-boot的特點:

U-boot命令介紹

printenv 顯示所有環境變量

setenv 設置新的環境變量

saveenv 將當前定義的所有的環境變量值存入flash中

tftp 通過網絡下載程序

protect 對Nor Flash寫保護

erase 擦除Nor FLASH

Nand相關命令

movi 命令

bootcmd 自啓動命令

bootm kernel-addr ramdisk-addr dtb-addr

go addr 執行內存中的二進制代碼,簡單的跳轉到指定地址(運行裸機程序)

U-BOOT 配置編譯

U-Boot目錄結構

編譯U-boot

使用build.sh編譯

查看build.sh

U-BOOT編譯生成的映像文件

​U-boot鏡像下載燒錄

u-boot-fs4412.bin


Bootloader 介紹

什麼是Bootloader

  • Bootloader是硬件啓動的引導程序,是運行操作系統的前提;
  • 在操作系統內核或用戶應用程序運行之前運行的一小段代碼。對軟硬件進行相應的初始化和設定,爲最終運行操作系統準備好環境;
  • 在嵌入式系統中,整個系統的啓動加載任務通常由Bootloader來完成。

Bootloader的特點

  • Bootloader不屬於操作系統,一般採用彙編語言和C語言開發。需要針對特定的硬件平臺編寫。
  • 在移植系統時,首先爲開發板移植Bootloader。
  • Bootloader不但依賴於CPU的體系結構,而且依賴於嵌入式系統板級設備的配置。

Bootloader的操作模式

  • 自啓動模式:在這種模式下,Bootloader從目標機上的某個固態存儲設備上將操作系統加載到RAM中運行,整個過程並沒有用戶的介入。
  • 交互模式:在這種模式下,目標機上的Bootloader將通過串口或網絡等通信手段從開發主機(Host)上下載內核映像和根文件系統映像等到RAM中。可以被 Bootloader寫到目標機上的固態存儲媒質中,或者直接進行系統的引導。也可以通過串口接收用戶的命令。

常用bootloader介紹

å¨è¿éæå¥å¾çæè¿°
U-boot介紹

u-boot(Universal Boot Loader)是德國DENX小組開發的用於多種嵌入式CPU的bootloader程序。遵循GPL條款。
從FADSROM、8xxROM 、PPCBOOT、Armboot逐步發展演化而來;
當前版本號:參考Makefile。
http://www.denx.de/wiki/U-Boot/WebHome

U-boot的特點:

代碼結構清晰、易於移植(見目錄結構)
支持多種處理器體系結構(見arch目錄)
支持衆多開發板(目前官方包中有200多種,見board目錄)
命令豐富、有監控功能
支持網絡協議、USB、SD等多種協議和設備
支持文件系統
更新較活躍,使用者多,有助於解決問題

U-boot命令介紹

命令分類
環境設置、數據傳輸、存儲器訪問、加載運行

printenv 顯示所有環境變量

ORIGEN # pri


setenv 設置新的環境變量

ORIGEN # set myboard FS4412 
ORIGEN # pri

å¨è¿éæå¥å¾çæè¿°

saveenv 將當前定義的所有的環境變量值存入flash中

å¨è¿éæå¥å¾çæè¿°

tftp 通過網絡下載程序

U-boot # setenv ethaddr 11:22:33:44:55:66 //設置開發板的物理地址

   U-boot # setenv  ipaddr  192.168.2.10
   U-boot # setenv  serverip  192.168.2.231
   U-boot # tftp  41000000  application.bin
   U-boot # tftp  41000000  zImage

protect 對Nor Flash寫保護

protect on 0 10000 對區間[0x0, 0x10000]進行寫保護
protect off 0 10000 對上述區間取消寫保護

erase 擦除Nor FLASH

erase all 擦除FLASH所有的扇區
erase 0 10000 把FLASH區間 [0x0, 0x10000]擦除

Nand相關命令

nand read addr off size
nand write addr off size
nand erase [clean] [off size]

NAND flash和NOR flash的區別詳解 https://zhidao.baidu.com/question/1993729068599410707.html
NAND flash按塊訪問和NOR flash按字節訪問
NAND flash必須先擦出後寫

movi 命令

movi init —初始化eMMC並顯示相關信息
movi read u-boot/kernel addr //讀u-boot或讀kernel,可以選擇
movi write u-boot/kernel addr
movi read rootfs addr size
movi write rootfs addr size


bootcmd 自啓動命令


如果定義了該變量,在自啓動模式下將會執行該環境變量中的命令。
將文件通過tftp自動下載到指定的地址
U-boot # setenv bootcmd tftp 41000000 uImage; bootm 41000000
U-boot # saveenv

å¨è¿éæå¥å¾çæè¿°

bootargs 是uboot傳遞給內核到啓動參數,是一個字符串
console=xxx: 告訴內核啓動時候到調試信息是從哪個設備輸出,這裏是串口2
init=xxx:  告訴內核linux到第一個用戶進程是什麼
root=xxx : 告訴內核根文件系統在哪裏
root=/dev/nfs 表示根文件系統在網路遠端
nfsroot=(開發板)ip:path rw     其中rw表示可讀可寫
ip=xxx :(Ubuntu ip)告訴內核開機的時候內核的ip地址是多少(靜態分配ip)

bootm kernel-addr ramdisk-addr dtb-addr

引導內核爲內核傳參,其中內核和ramdisk通常爲mkimage處理過的二進制文件。
從這個地址處自動啓動程序

å¨è¿éæå¥å¾çæè¿°


go addr 執行內存中的二進制代碼,簡單的跳轉到指定地址(運行裸機程序)


U-BOOT 配置編譯

U-Boot目錄結構

  • 平臺相關

arch, board, include…

  • 平臺無關

common, net, fs, drivers…

  • 工具和文檔

tools, doc

å¨è¿éæå¥å¾çæè¿°

編譯U-boot

  • U-boot的編譯

整個工程通過Makefile來組織編譯。頂層目錄下的Makefile中包含了開發板的配置信息。從頂層目錄開始遞歸地調用各級子目錄下的Makefile,最後鏈接成u-boot映像。

  • 頂層目錄下的 Makefile

它負責u-boot整體配置和編譯
在Makefile中指定使用的交叉工具鏈
配置u-boot: make origen_config
編譯: make

使用build.sh編譯

linux@linux:~/u-boot-2013.01-fs4412$ ./build.sh

查看build.sh

#!/bin/sh

sec_path="CodeSign4SecureBoot/"
CPU_JOB_NUM=$(grep processor /proc/cpuinfo | awk '{field=$NF};END{print field+1}')
ROOT_DIR=$(pwd)
CUR_DIR=${ROOT_DIR##*/}

case "$1" in
    clean)
        echo make clean
        make mrproper
        ;;
    *)
            
        if [ ! -d $sec_path ]
        then
            echo "**********************************************"
            echo "[ERR]please get the CodeSign4SecureBoot first"
            echo "**********************************************"
            return
        fi
        


        make fs4412_config
        
        make -j$CPU_JOB_NUM
        
        if [ ! -f checksum_bl2_14k.bin ]
        then
            echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
            echo "There are some error(s) while building uboot, please use command make to check."
            echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
            exit 0
        fi
        
        cp -rf checksum_bl2_14k.bin $sec_path
        cp -rf u-boot.bin $sec_path
        rm checksum_bl2_14k.bin
        
        cd $sec_path
        cat E4412_N.bl1.SCP2G.bin bl2.bin all00_padding.bin u-boot.bin tzsw_SMDK4412_SCP_2GB.bin > u-boot-fs4412.bin
        mv u-boot-fs4412.bin $ROOT_DIR
        
        rm checksum_bl2_14k.bin
        rm u-boot.bin

        echo 
        echo 
        ;;
        
esac

U-BOOT編譯生成的映像文件

å¨è¿éæå¥å¾çæè¿°
U-boot鏡像下載燒錄

燒錄編譯產生的鏡像 u-boot.bin
初次或開發板代碼損壞不能正常啓動時,可採用JTAG工具燒錄
專用的燒錄工具如h-jtag或DNW等
在u-boot已經能工作,升級或修正U-boot時,可用U-boot中的命令來燒錄
其它方式 如SD卡 , Fastboot命令
鏡像固化位置
ROM、NOR FLASH、NAND FLASH EMMC等

u-boot-fs4412.bin

  1. u-boot.bin是uboot編譯源碼後直接產生的,一般的的開發板,直接燒寫這個文件就可以了
  2. 但是三星的cortex_a9 exynos4412這款CPU把uboot中一些初始化時鐘等的代碼剝離出去了,所以,編譯好的這個u-boot.bin還要加上被剝離出去的部分,纔可以正常使用
  3. 所以在build.sh腳本文件中,在u-boot.bin之前加上了剝離出去的部分後,生成了u-boot-fs4412.bin
  4. å¨è¿éæå¥å¾çæè¿°
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章