uboot(universal bootloader 通用啓動代碼)
1. 本質:裸機程序:上電就運行,獨佔CPU,啓動內核就結束
2. 核心功能:啓動系統內核
3. uboot是個開源項目,是bootloader標準
PC啓動流程
1. BIOS程序由廠家燒錄在主板(norflash)上(操作系統在硬盤)
2. BIOS初始化內存/硬盤
3. BIOS把操作系統從硬盤讀到DDR
4. BIOS啓動系統
5. BIOS結束
uboot啓動流程
1. uboot程序/操作系統在flash上
2. uboot初始化內存/flash(這裏會通過寄存器讀取信息,判斷是從Flash/SD卡/U盤等啓動)
3. uboot把操作系統讀到DDR
4. uboot啓動內核,傳參
5. uboot結束
6. 內核啓動後加載根文件系統(這個不是uboot乾的,uboot已經結束了)
uboot功能
1. 啓動內核,傳參(參數放到內存指定位置,內核再去取)
2. soc級(芯片級)驅動:flash驅動(初始化/讀寫),時鐘/網絡等硬件驅動
3. 燒錄下載uboot/kernel/rootfs
4. 命令行工具(其實就是死循環讀取行緩衝)
命令
help:幫助
print:即printenv,用來查看環境變量
set:即setenv,修改環境變量
save:即saveenv,保存環境變量
環境變量
格式:set name value
添加或修改環境變量:set a 1 # 如果環境變量a存在,則修改a=1,否則添加這個環境變量
刪除環境變量:set a # 設個空值
注意:
1. 如果值是有空格或很長的字符串,用單引號括起來
2. 保存環境變量:set只對當前有效,uboot結束後,就沒了。如果需要下次使用需要保存命令save
系統分區
一般對Flash劃分位4個分區:uboot(1M)/uboot環境變量(32K)/kernel(5M)/rootfs,每個分區的大小自由分配
uboot直接啓動(flash起始位置),再把uboot環境變量讀取到內存中(這就是爲什麼我們set變量,但下次就沒有了。save後才把內存中的環境變量寫入到flash指定分區),再把kernel讀到內存
下載
1. 先測試網絡ping
2. tftp下載(網絡)
a. tftp作爲服務器,uboot作爲客戶端,直接把文件從tftp服務器下載到指定內存地址(注意:uboot沒有內存管理,注意內存的覆蓋,內核啓動後由內核管理)
b. 設置環境變量
serverip:tftp服務器地址
ipaddr:本機地址(要和tftp服務器同網段)
netmask:子網掩碼
getewayip:網關
ethaddr:網卡mac地址
c. 下載到內存中:tftp 0x30000000 xxx
d. 從內存保存到flash:movi
3. fastboot下載(usb)
內存操作
movi read:從flash讀到內存
movi write:從內存寫入flash
movi write u-boot 0x30000000
mm:修改內存值
mw:寫內存值
md:顯示內存值
把zImagecopy到/tftp下
tftp 31000000 zImage
nand erase 200000 300000(offset size)
nand write 31000000 200000 300000(內存addr offset size)
啓動內核
命令:bootm(從指定地址啓動內核,可傳參)/go(不傳參)
環境變量:
bootdelay:倒計時
bootcmd:自動運行命令
bootargs:啓動參數
示例
啓動命令:
bootcmd=load mmc 0:1 0x41800000 sun8i.dtb; load mmc 0:1 0x41000000 zImage; bootz 0x41000000 - 0x41800000
啓動參數:
bootargs=console=ttyS0,115200 panic=5 console=tty0 rootwait root=/dev/mmcblk0p2 earlyprintk rw
console:控制檯輸出
root:根文件系統在flash的第2分區
rw:可讀寫
init:linux的init進程的路徑
rootfstype:文件系統類型