環境變量的作用
環境變量的優先級
uboot代碼當中有一個值,環境變量中也有一個值。uboot程序實際運行時規則是:如果環境變量為空,則使用代碼中的值;如果環境變量不為空則優先使用環境變量對應的值
比如machid機器碼,uboot在x210_sd.h中定義了一個機器碼2456,寫死在程序中,如果要更改要修改源代碼,並且重新編譯。比較簡單的方式是使用環境變量machid。set machid 0x998,有了環境,系統則優先使用環境變量中的值。這就是優先級的問題
環境變量在uboot中的工作方式
((1)默認環境變量,在uboot/common/env_common.c中default_environment,這東西本質是一個字符數組,大小為CFG_ENV_SIZE(16kb),里面內容就是很多個環境變量連續分布組成的,每個環境變量最末端以'\0'結束。
(2)SD卡中環境變量分區,在uboot的raw分區中。SD卡中其實就是給了個分區,專門用來存儲而已。存儲時其實是把DDR中的環境變量整體的寫入SD卡中分區里。所以當我們saveenv時其實整個所有的環境變量都被保存了一遍,而不是只保存更改了的。
(3)DDR中環境變量,在default_environment中,實質是字符數組。在uboot中其實是一個全局變量,鏈接時在數據段,重定位時default_environment就被重定位到DDR中一個內存地址處了。這個地址處這個全局字符數組就是我們uboot運行時的DDR中的環境變量了。
總結:剛燒錄的系統中環境變量分區是空白的,uboot第一次運行時加載的是uboot代碼中自帶的一份環境變量,叫默認環境變量。我們在saveenv時DDR中的環境變量會被更新到SD卡中的環境變量中,就可以被保存下來,下次開機會在環境變量relocate時會SD卡中的環境變量會被加載到DDR中去。
default_environment中的內容雖然被uboot源代碼初始化為一定的值(這個值就是我們的默認環境變量),但是在uboot啟動的第二階段,env_relocate時代碼會去判斷SD卡中的env分區的crc是否通過。如果crc校驗通過說明SD卡中有正確的環境變量存儲,則relocate函數會從SD卡中讀取環境變量來覆蓋default_environment字符數組,從而每次開機可以保持上一次更改過的環境變量。、
do_printenv
do_setenv
int do_setenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { if (argc < 2) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } return _do_setenv (flag, argc, argv); }