<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > WinCE EBOOT中的Boot Args與Driver Globals

          WinCE EBOOT中的Boot Args與Driver Globals

          作者: 時(shí)間:2011-02-24 來源:網(wǎng)絡(luò) 收藏

          在EBOOT中包含的一個(gè)重要的緩沖區(qū)叫Driver Globals,它用于在設(shè)備驅(qū)動(dòng)和WinCE OS之間共享數(shù)據(jù)。而在EBOOT中會(huì)用到的啟動(dòng)參數(shù)結(jié)構(gòu)被稱為Boot Args,是指用于EBOOT和WinCE OS之間共享一些參數(shù)信息。一般來說Boot Args會(huì)在EBOOT運(yùn)行的時(shí)候被賦值或者更新,最常用的就是網(wǎng)絡(luò)設(shè)備的相關(guān)信息設(shè)置,比如IP地址,MAC地址,中斷等信息。


          Driver Globals包含了Boot Args,也就是說Driver Globals是一塊內(nèi)存緩沖區(qū),其中里面也包含了Boot Args的內(nèi)存緩沖區(qū)。這里要說明的是Driver Globals是一個(gè)可選用的功能,無非就是一塊內(nèi)存,在EBOOT和WinCE OS之間進(jìn)行數(shù)據(jù)共享。如果你想用,你就用,不想用,也可以不用。我們?cè)谑褂肈river Globals的時(shí)候,一般會(huì)在eboot.bib和config.bib文件定義一塊預(yù)留的內(nèi)存區(qū)域,在這兩個(gè)文件中定義的這塊內(nèi)存區(qū)域的起始地址和大小必須一致,相信這個(gè)大家都能理解,至于類型肯定是RESERVED。這樣一來,在EBOOT和WinCE運(yùn)行的時(shí)候,這塊共享內(nèi)存就被預(yù)留出來了。當(dāng)然,我們還需要在BSP中通過宏定義來定義這塊內(nèi)存的起始地址和大小,這樣就可以在BSP中訪問這塊內(nèi)存了。舉例:


          首先在eboot.bib和config.bib都要有下面的定義:


          MEMORY
          ; Name Start Size Type
          ; ------- -------- -------- ----
          ARGS 80020800 00000800 RESERVED


          上面的描述表示Driver Globals的共享內(nèi)存的起始地址是0x80020800,大小是0x800。


          然后還要在BSP中對(duì)其起始地址和大小進(jìn)行宏定義,如下:


          #define IMAGE_SHARE_ARGS_UA_START 0xA0020000
          #define IMAGE_SHARE_ARGS_CA_START 0x80020800
          #define IMAGE_SHARE_ARGS_SIZE 0x00000800


          這樣,EBOOT就可以通過上面的宏定義的地址來訪問共享內(nèi)存了。這塊共享區(qū)域是用Driver Globals結(jié)構(gòu)來描述的,具體定義如下:


          typedef struct _DRIVER_GLOBALS
          {
          //
          // 之后,可以定義用于驅(qū)動(dòng)程序和WinCE OS之間的共享信息
          //


          BOOT_ARGS bootargs;
          } DRIVER_GLOBALS, *PDRIVER_GLOBALS;


          可以看出里面包含了用于描述Boot Args的BOOT_ARGS結(jié)構(gòu),當(dāng)然用戶也可以在結(jié)構(gòu)中添加用于驅(qū)動(dòng)和WinCE OS之間共享的數(shù)據(jù)類型。


          下面介紹一下Boot Args的BOOT_ARGS結(jié)構(gòu),定義如下:



          #define BOOTARG_SIG 0x544F4F42 // "BOOT"


          typedef struct BOOT_ARGS
          {
          DWORD dwSig;
          DWORD dwLen; // BOOT_ARGS的結(jié)構(gòu)長(zhǎng)度
          UCHAR ucLoaderFlags; // Boot loader設(shè)定的標(biāo)志
          UCHAR ucEshellFlags; // EShell標(biāo)志
          DWORD dwEdbgDebugZone; // 調(diào)試域Debug Zone的定義


          EDBG_ADDR EshellHostAddr; // Host端的IP地址和EShell的UDP端口號(hào)
          EDBG_ADDR DbgHostAddr; // IP地址和接收Debug信息的UDP端口號(hào)
          EDBG_ADDR CeshHostAddr; // IP地址和以太網(wǎng)cesh的UDP端口號(hào)
          EDBG_ADDR KdbgHostAddr; // IP地址和Kenel Debugger的UDP端口號(hào)


          ETH_HARDWARE_SETTINGS Edbg; // 調(diào)試以太網(wǎng)卡的硬件設(shè)置信息
          } BOOT_ARGS, *PBOOT_ARGS;


          其中Boot loader的設(shè)置標(biāo)志定義如下:



          #define LDRFL_USE_EDBG 0x0001 // 設(shè)置嘗試使用調(diào)試以太網(wǎng)
          //如果設(shè)置了LDRFL_USE_EDBG,下面兩個(gè)標(biāo)志才會(huì)被看到
          #define LDRFL_ADDR_VALID 0x0002 // 當(dāng)EdbgAddr有效時(shí)設(shè)置
          #define LDRFL_JUMPIMG 0x0004 // 不使用與Eshell通信



          在上面的BOOT_ARGS結(jié)構(gòu)中的ETH_HARDWARE_SETTINGS結(jié)構(gòu)定義如下:



          typedef struct _ETH_HARDWARE_SETTINGS
          {
          EDBG_ADAPTER Adapter; // 與Platform Builder通信的網(wǎng)卡
          UCHAR ucEdbgAdapterType; // 調(diào)試以太網(wǎng)卡的類型
          UCHAR ucEdbgIRQ; // 調(diào)試以太網(wǎng)卡的IRQ
          DWORD dwEdbgBaseAddr; // 調(diào)試以太網(wǎng)卡的基地址
          DWORD dwEdbgDebugZone; // 調(diào)試以太網(wǎng)卡的調(diào)試域


          char szPlatformString[EDBG_MAX_DEV_NAMELEN]; //一個(gè)唯一的目標(biāo)板設(shè)備名


          UCHAR ucCpuId; // 處理器類型
          } ETH_HARDWARE_SETTINGS, *PETH_HARDWARE_SETTINGS;


          我的是2440 5.0采用的是三星08年的BSP,系統(tǒng)可以啟動(dòng)但是 pBSPArgs->nfsblk = -1 ,跟蹤了一下了是:pBSPArgs = ((BSP_ARGS *) IMAGE_SHARE_ARGS_UA_START);這個(gè)參數(shù)可以該其他的嗎?nanjianhui 發(fā)表于2009年2月25日 20:45:39 IP:舉報(bào)
          你是指pBSPArgs么?改是可以改,它實(shí)際上是一個(gè)共享內(nèi)存的起始地址。至于為什么pBSPArgs->nfsblk = -1,我想根本原因是該變量對(duì)應(yīng)的內(nèi)存沒有被初始化,我想你首先要確定該變量是在哪里被初始化的。AMOROUS 發(fā)表于2009年2月26日 10:46:58 IP:舉報(bào)
          大俠小弟有個(gè)關(guān)于EP9315WINCE里面PHYSICAL_EQUAL_VIRTUAL的問題 PHYSICAL_EQUAL_VIRTUAL在oempreinit.c置了1,memorymap.h里用它來使sdram/flash/sram等虛擬地址和對(duì)應(yīng)的物理地址等同起來,就拿sdram來說,片選物理地址0X00000000,如果虛擬地址也等于0X00000000,是否與用戶進(jìn)程沖突?為什么要這樣做?而不是把虛擬地址映射從0X80000000開始?還有就是OEMAddressTable和config.bib里的MEMORY設(shè)置虛擬地址是否有關(guān)?nanjianhui 發(fā)表于2009年2月27日 15:04:35 IP:舉報(bào)
          在oempreinit.c中確實(shí)將PHYSICAL_EQUAL_VIRTUAL設(shè)置為1,但是它對(duì)OEMAddressTable沒有影響。OEMAddressTable會(huì)受memorymap.h中#define的影響,而memorymap.h應(yīng)該包含了memorymap-9315.h。
          我目前手上沒有EP93系列的BSP,不過我記得應(yīng)該是這樣的。也就是說oempreinit.c中的定義是沒有意義的,不會(huì)對(duì)OEMAddressTable產(chǎn)生影響。這屬于歷史遺留問題。
          關(guān)于OEMAddressTable和config.bib是否有關(guān)。我想應(yīng)該說OEMAddressTable是一個(gè)物理地址/虛擬地址的映射表,我專門有一篇blog介紹OEMAddressTable,你可以看看。而config.bib實(shí)際上是確定了在WinCE系統(tǒng)中RAM的分配。AMOROUS 發(fā)表于2009年2月27日 15:51:23 IP:舉報(bào)
          明白大俠,還有另外一個(gè)問題,現(xiàn)在在板上加了一個(gè)512k的可掉電sram,選通用cs2(主要是參考了原來BSP上OEMAddressTable也有sram的配置,不用再添加),想讓它作為硬盤用,并在系統(tǒng)中以盤符形式顯示,并可以實(shí)現(xiàn)讀寫存儲(chǔ),我拷了wince自帶的ramdisk驅(qū)動(dòng)過來進(jìn)行了修改,作為驅(qū)動(dòng)來添加,并在注冊(cè)表添加了sram的起始地址來定位(\builtin\ramdisk\address),現(xiàn)在燒進(jìn)去后可以在存儲(chǔ)屬性里看到ramdisk的信息,問題是無法裝入分區(qū),也就無法看到盤符,請(qǐng)問這種思路是否正確,是否由于地址定位錯(cuò)誤引起的呢?請(qǐng)大俠抽空幫小弟看看AMOROUS 發(fā)表于2009年2月27日 15:54:59 IP:舉報(bào)
          還有我的config.bib也reserved了一個(gè)ramdisk,是從0x8c000000開始的1m空間nanjianhui 發(fā)表于2009年2月28日 12:12:53 IP:舉報(bào)
          這種問題,我建議先看看WinCE的ramdisk的代碼,理解了然后進(jìn)行調(diào)試。


          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();