<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ~~~ void env_relocate (void) { /* * We must allocate a buffer for the environment */ env_ptr = (env_t *)malloc (CFG_ENV_SIZE); if (gd->env_valid == 0) { puts ("*** Warning - bad CRC, using default environment\n\n"); show_boot_progress (-60); set_default_env(); } else { env_relocate_spec (); } gd->env_addr = (ulong)&(env_ptr->data); } ~~~ 第6行? 由于在配置文件中要定義環境變量區域的大小,即#define CFG_ENV_SIZE 0x10000, 這里從 heap堆里分配出這么大的空間來,并用env_ptr指向它 第7行?前面在循環體的 env_init() 中有? ~~~ gd->env_addr = (ulong)&default_environment[0]; gd->env_valid = 1; ~~~ 第10行?使用默認的環境變量.env_init()中已經看到default_environment[],這是程序初始時的一份 環境變量默認設置,set_default_env()即將default_environment[]數組中的各環境變量項復制到 env_ptr所指向的env_t結構里(確切地說是復制到env_t結構的數據區里)。 第12行?環境變量存在nand中,將其從nand中讀出,并填入env_ptr指向的env_t結構里 從nand讀出時,配置項中有CFG_ENV_OFFSET,即環境變量在nand中存儲的起始地址 CFG_ENV_SIZE 環境變量大小數據讀錯 或 數據校驗出錯,都會使用默認的環境變量配置use_default(), 第一次運行uboot時板子會打印如下信息 ` Warning - bad CRC or NAND, using default environment ` 就是因為讀出的數據經過crc32校驗出錯(此時讀出的數據不是環境變量),進而調用use_default(),在 use_default()中會打印該信息。 第14行?又將gd->env_addr指向env_ptr->data 來看下env_t結構, 在include/environment.h中 ~~~ typedef?? ?struct environment_s { ?? ?uint32_t?? ?crc;?? ??? ?/* CRC32 over data bytes?? ?*/ ?? ?unsigned char?? ?data[ENV_SIZE]; /* Environment data?? ??? ?*/ } env_t; ~~~ 整個env_t結構占CFG_ENV_SIZE大小,所以data區就占CFG_ENV_SIZE - sizeof(crc) 大小,足夠 使用了。 **小結env_relocate 所做的事情有3件** 1.從heap中分配一段空間,用于env_t結構 2.找到環境變量(或從內存中找或從nand中找),填充env_t結構 3.將gd->env_addr指向env_ptr->data,這個也就是這里的relocate所在吧。 ~~~ /* IP Address */ gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr"); ~~~ 將環境變量弄完之后,緊接著就是從環境變量的相應項中獲取信息,環境變量是用戶與u-boot的一個交互方式, 有了它之后,用戶即可通過修改環境變量來修改板子的一些信息配置。這里的ip地址和網卡地址即是其中的一 個典型例子。來看上面的程序: 第2行,獲取ip地址,注意gd->bd->bi_ip_addr是ungisned long 類型,而ip地址是類似于 "192.168.1.111"的字符串。往下跟蹤: ~~~ IPaddr_t getenv_IPaddr (char *var) { return (string_to_ip(getenv(var))); } ~~~ getenv("ipaddr") 即在環境變量中找到ipaddr這一項對應的字符串,假設這里為"192.168.1.111" 將"192.168.1.111"傳入string_to_ip。? IPaddr_t 類型是unsigned long 的一個typedef ~~~ IPaddr_t string_to_ip(char *s) { IPaddr_t addr; char *e; int i; if (s == NULL) return(0); for (addr=0, i=0; i<4; ++i) { ulong val = s ? simple_strtoul(s, &e, 10) : 0; addr <<= 8; addr |= (val & 0xFF); if (s) { s = (*e) ? e+1 : e; } } return (htonl(addr)); } ~~~ 12~19行?192.168.1.111 分為四個段,也就是要做4次 simple_strtoul()轉換成10進制的整型 第次轉換后的值賦給val。addr是unsigned long型,32位的,將其分為4段,每8位存儲ip地址中的一個 段,比如這里, 最后addr = (((((192 << 8) | 168) << 8) | 1) << 8 ) | 111 = 0xc0a8016f 第20行,主機字節順序轉換為網絡字節順序返回 若CPU為小端模式時,addr如下存儲 31?????????? 24 23?????????? 16 15???????????? 8 7?????????????? 0 +--------------+---------------+----------------+-----------------+ | 192 = 0xc0?? | 168 = 0xa8??? |?? 1 = 0x01???? |? 111 = 0x6f???? | +--------------+---------------+----------------+-----------------+ ???? 3??????????????? 2????????????????? 1?????????????? 0 若CPU為大端模式時,addr如下存儲 31?????????? 24 23?????????? 16 15???????????? 8 7?????????????? 0 +--------------+---------------+----------------+-----------------+ | 111 = 0x6f?? |? 1 = 0x01???? |? 168 = 0xa8??? |? 192 = 0xc0???? | +--------------+---------------+----------------+-----------------+ ????? 3??????????????? 2???????????????? 1?????????????? 0 當與另一臺計算機通信時,通常不知道對方存儲數據時是先存放最高位字節 (MSB)還是最低位字節 (LSB) 恰恰網絡字節順序跟大端模式時相同,htonl函數就是將主機字節順序轉為網絡字節順序,在最高位字節(MSB)-最前 的系統上,這些函數什么都不做。在 最低位字節(LSB)-最前的系統上它們將值轉換為正確的順序。 最后將值返回給了gd->bd->bi_ip_addr, 所以其值應該是0x6f01800a ~~~ /* MAC Address */ { int i; ulong reg; char *s, *e; char tmp[64]; i = getenv_r ("ethaddr", tmp, sizeof (tmp)); s = (i > 0) ? tmp : NULL; for (reg = 0; reg < 6; ++reg) { gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0; if (s) s = (*e) ? e + 1 : e; } } ~~~ 網卡地址以十六進制的形式存于gd->bd->bi_enetaddr[]數組中
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看