嵌入式產品:編譯boot

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:文件系統類型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章