uboot學習之七---uboot的環境變量


環境變量的作用
環境變量的優先級
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);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM