日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

uboot中变量env(收集)

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uboot中变量env(收集) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Envu-boot中通常有兩種存在方式,在永久性存儲介質中(flashNVRAM等),在SDRAM中。可配置不適用env的永久存儲方式,但不常用。U-boot在啟動時會將存儲在永久性存儲介質中的env重新定位到RAM中,這樣可以快速訪問,同時可以通過saveenvRAM保存到永久性存儲介質中。

  • 相關結構體

  • env_t定義于include/environment.h

    typedef struct environment_s {

    uint32_t crc; /* CRC32 over data bytes */

    #ifdef CFG_REDUNDAND_ENVIRONMENT

    unsigned char flags; /* active/obsolete flags */

    #endif

    unsigned char data[ENV_SIZE];

    } env_t;

    結構說明:

    crcu-boot在保存env的時候加上去的校驗頭,在第一次啟動時一般crc校驗會出錯,這很正常,因為此時Flash中的數據無效。

    data字段保存實際的環境變量。U-bootenv采用name=value”\0”的方式存儲,在所有env的最后以“\0\0表示整個env的結束。新的name=value對總是被添加到env數據塊的末尾,當刪除一個name=value對時,后面的環境變量將前移,對一個已經存在的環境變量的修改實際上先刪除再插入。


    env會從flash等存儲設備重定位到RAM中,在env的不同實現版本(env_xxx.c)中定義了env_ptr,它指向envRAM中的位置u-boot在重定位env后對環境變量的操作都是針對env_ptr

    env_embedded.c-----envuboot存儲于同一塊區。

    env_nand.c------------env存儲在nandflash中。

    env_dataflash.c --env存儲在dataflash中。

    env_eeprom.c --env存儲在eeprom中。

    env_flash.c --env存儲在norflash中。


    env_ptr指向環境參數區,系統啟動時默認的環境參數default_environment[],定義于common/env_common.c

    uchar default_environment[] = {

    61 #ifdef CONFIG_BOOTARGS

    62 "bootargs=" CONFIG_BOOTARGS "\0"

    63 #endif

    64 #ifdef CONFIG_BOOTCOMMAND

    65 "bootcmd=" CONFIG_BOOTCOMMAND "\0"

    66 #endif

    ......

    127 #if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0)

    128 "pcidelay=" MK_STR(CONFIG_PCI_BOOTDELAY) "\0"

    129 #endif

    130 #ifdef CONFIG_EXTRA_ENV_SETTINGS

    131 CONFIG_EXTRA_ENV_SETTINGS

    132 #endif

    133 "\0"

    134 };

    參數解釋如下:

    bootfile 定義缺省的下載文件

    bootargs 定義傳遞給Linux內核的命令行參數

    bootcmd 定義自動啟動時執行的幾條命令

    serverip 定義tftp服務器端的IP地址

    ?

    env_t中除了數據之外還包含校驗頭,u-bootenv_t的數據指針又保存在另外一個地方,這就是gd_t數據結構(不同平臺有不同的gd_t),這里以ARM為例僅列出env相關的部分。

    typedef struct global_data

    {

    ……

    unsigned long env_off;

    unsigned long env_addr;

    unsigned long env_valid; /* checksum of environment valid */

    ……

    } gd_t;

    <include/asm-arm/global_data.h>

    gd_t.env_addr即指向env_ptr->data


  • 相關文件

  • common/env_common.c

    u-boot調用的通用函數接口,它們隱藏了env的不同實現方式,比如dataflasheepromflash等。

    common/env_dataflash.c

    env存儲在dataflash中的實現

    common/cmd_nvedit.c

    實現u-boot對環境變量的操作命令

    environment.c

    環境變量以及一些宏定義


    env如果存儲在flash中還需要flash的支持。


  • 環境變量操作流程

  • Env初始化

    Start_armbootlib_arm/board.c

    *env_initenv_xxx.cxxx = nand|flash|eeprom……

    env_relocateenv_common.c

    *env_relocate_specenv_xxx.c


    ENV_IS_EMBEDDEDenv是否存在于u-boot TEXT段中。

    CFG_ENV_SIZEenv塊的大小。

    CFG_ENV_IS_IN_NANDenv塊是否存在Nand Flash中。

    CFG_ENV_OFFSETenv塊在Flash中偏移地址。

  • env_init

  • 實現env的第一次初始化,對于nand env(非embedded方式):

    env_nand.cenv_int

    gd->env_addr = (ulong)&default_environment[0];

    gd-env_valid = 1;


  • env_relocate

  • env_common.cenv_relocate

    DEBUGE(“%s[%d] offset = 0x%lx\n”, __FUNCTION__, __LINE__, gd->reloc_off);


    env_ptr = (env_t *)malloc(CFG_ENV_SIZE);

    DEBUGE(“%s[%d] malloced ENV at %p\n”, __FUNCTION__, __LINE__, env_ptr);

    env_relocate_spec();

    gd->env_addr = (ulong)&(env_ptr->data);


  • env_relocate_spec

  • size_t total;

    ret = readenv(CFG_ENV_OFFSET, (u_char *) env_ptr);

    // nand_read(&nand_info[0], CFG_ENV_OFFSET, &total, (u_char *)env_ptr);

    if(ret || total!= CFG_ENV_SIZE)

    return use_default();


    if(crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)

    return use_default();


    env_relocate_spec的意圖就是調用nand_read將環境變量從CFG_ENV_OFFSET處讀出,環境變量的大小為CFG_ENV_SIZE(注意CFG_ENV_OFFSETCFG_ENV_SIZE要和nandflash的塊/頁邊界對齊。讀出數據后再調用crc32env_ptr->data進行校驗并與保存在env_ptr->crc的校驗碼對比,確認數據是否出錯。從這里可以看出在系統第一次啟動時,Nand Flash里面沒有存儲任何環境變量,crc校驗肯定出錯,當我們保存環境變量后,接下來在啟動板子u-boot就不會再報crc32出錯了。

  • saveenv

  • env_nand.csaveenv

    其調用nand_erasenand_write進行nand flasherasewritenand_writenand_erasenand驅動建構。


    env在內存中位置不定。env在內存中的空間是由malloc分配的(env_common.c中的env_relocate()),因此其在內存中的位置是一直變化的。每次系統啟動時,env在內存中位置可能都不一樣。


  • 環境變量優化

  • 由于u-boot代碼通常達到100KB左右,且必須從地址0處開始,按照這樣的分配方式(Nandflash結構),我們必須為env分配一塊64KBsector,而實際使用到的可能只是其中幾百個字節!u-boot還會為envRAM中保持一塊同樣大小的空間,這就造成ROMRAM空間不必要的浪費。

    為了盡可能減少資源浪費,同時保證系統的健壯性,我們可以把env放置在flash中容量最小的sector里。這樣,env嵌入(embed)到u-boot的代碼段。在common/environment.h中會比較envmonitor的范圍,如果確定env位于monitor內,則定義ENV_IS_EMBEDDED

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的uboot中变量env(收集)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。