說明:1)板子裏原本是沒有環境變量的,u-boot的缺省情況下會有一些基本的環境變量,定義在頭文件中;
2)執行了saveenv/save之後,環境變量會第一次保存到nor flash/nand flash/sd卡指定的地址,之後修改、保存、刪除等都是基於flash/sd卡中的環境變量的操作。
環境變量如何參與程序運行
(1)環境變量有2份,分別在Flash和DDR中。uboot開機時一次性從Flash中讀取全部的環境變量到DDR中作爲環境變量的初始值,uboot使用過程中都是用DDR中的這一份。用戶可以使用saveenv指令將DDR中的環境變量重新寫入Flash中去更新Flash中的環境變量,下次開機時又會從Flash中再讀一次。
(2)環境變量在uboot中是用字符串表示的,即uboot中是按照字符匹配的方式區分各個環境變量的,在使用時一定要注意正確的輸入字符。
1、ramdisk
在Linux中可以將一部分內存mount爲分區來使用,通常稱之爲RamDisk。
ramdiskinitrd=echo xxx ...; run findfdt; run loaduimagefat; run loadramdisk; run xxxrargs; setenv bootargs ${bootargs} ; if run loadfdtfat; then bootm ${kloadaddr} - ${fdtaddr}; else bootm ${kloadaddr};fi
步驟:
run findfdt:findfdt=if test $board_name = A335X_SK; then setenv fdtfile am335x-evmsk.dtb; fi; if test $board = AM335x_evm; then setenv fdtfile am335x-evm.dtb; fi
根據板子名字,找內核dtb;
run loaduimagefat:loaduimagefat=fatload mmc ${mmcdev} ${kloadaddr} ${bootfile}
從存儲設備mmcdev=0中加載內核bootfile=uImage到kloadaddr=0x80007fc0
run loadramdisk:loadramdisk=fatload mmc ${mmcdev} ${rdaddr} ramdisk.gz
從存儲設備mmcdev=0中加載根文件系統ramdisk.gz到rdaddr=0x81000000
run xxxrargs:xxxrargs=setenv bootargs console=${console} ${optargs} root=/dev/ram0 rw ramdisk_size=65536 initrd=${rdaddr},64M rootfstype=${ramrootfstype}
設置控制檯console=ttyO0,115200n8
${optargs}爲空
root=/dev/ram0表示啓動的根文件系統位置
rw 加載根文件系統可讀寫
ramdisk_size=65536指定創建ramdisk的大小
initrd指定初始化ramdisk的位置(前面把ramdisk.gz加載到內存中的位置及佔有內存的大小,當沒有使用ramdisk啓動系統的時候,需要使用noinitrd這個參數,但是如果使用了的話,就需要指定initrd=r_addr,size, r_addr表示initrd在內存中的位置,size表示initrd的大小。
ramrootfstype=ext2指定根文件系統的類型,跟root一起配合使用,一般如果根文件系統是ext2的話,有沒有這個選項是無所謂的,但是如果是jffs2,squashfs等文件系統的話,就需要rootfstype指明文件系統的類型,不然會無法掛載根分區;
如果加載了設備樹 loadfdtfat=fatload mmc ${mmcdev} ${fdtaddr} ${fdtfile},則 bootm ${kloadaddr} - ${fdtaddr}
否則 bootm ${kloadaddr}
2、mtdblock
(1)linux內核啓動時可以接收uboot傳遞過來的啓動參數,這些啓動參數的內容和形式是uboot和內核事先約定好的,內核在這些啓動參數的指導下完成整個啓動過程。該設計方式是爲了保證內核在不重新編譯的情況下可以使用不同的方式啓動。我們需要在uboot中設置環境變量bootargs,然後bootm命令啓動內核時會自動將bootargs傳給內核。