WinCE EBOOT中的Boot Args與Driver Globals

轉自 http://blog.csdn.net/nanjianhui/archive/2008/10/26/3152348.aspx

 

在EBOOT中包含的一個重要的緩衝區叫Driver Globals,它用於在設備驅動和WinCE OS之間共享數據。而在EBOOT中會用到的啓動參數結構被稱爲Boot Args,是指用於EBOOT和WinCE OS之間共享一些參數信息。一般來說Boot Args會在EBOOT運行的時候被賦值或者更新,最常用的就是網絡設備的相關信息設置,比如IP地址,MAC地址,中斷等信息。

 

Driver Globals包含了Boot Args,也就是說Driver Globals是一塊內存緩衝區,其中裏面也包含了Boot Args的內存緩衝區。這裏要說明的是Driver Globals是一個可選用的功能,無非就是一塊內存,在EBOOT和WinCE OS之間進行數據共享。如果你想用,你就用,不想用,也可以不用。我們在使用Driver Globals的時候,一般會在eboot.bib和config.bib文件定義一塊預留的內存區域,在這兩個文件中定義的這塊內存區域的起始地址和大小必須一致,相信這個大家都能理解,至於類型肯定是RESERVED。這樣一來,在EBOOT和WinCE運行的時候,這塊共享內存就被預留出來了。當然,我們還需要在BSP中通過宏定義來定義這塊內存的起始地址和大小,這樣就可以在BSP中訪問這塊內存了。舉例:

 

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

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

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

 

 

然後還要在BSP中對其起始地址和大小進行宏定義,如下:

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

這樣,EBOOT就可以通過上面的宏定義的地址來訪問共享內存了。這塊共享區域是用Driver Globals結構來描述的,具體定義如下:

 

typedef struct _DRIVER_GLOBALS
{
    //
    // 之後,可以定義用於驅動程序和WinCE OS之間的共享信息
    //

    BOOT_ARGS        bootargs;
} DRIVER_GLOBALS, *PDRIVER_GLOBALS;  

可以看出裏面包含了用於描述Boot Args的BOOT_ARGS結構,當然用戶也可以在結構中添加用於驅動和WinCE OS之間共享的數據類型。

 

下面介紹一下Boot Args的BOOT_ARGS結構,定義如下:


#define BOOTARG_SIG  0x544F4F42 // "BOOT"

typedef struct BOOT_ARGS
{
    DWORD   dwSig;
    DWORD   dwLen;                // BOOT_ARGS的結構長度
    UCHAR   ucLoaderFlags;        // Boot loader設定的標誌
    UCHAR   ucEshellFlags;        // EShell標誌
    DWORD   dwEdbgDebugZone;      // 調試域Debug Zone的定義

    EDBG_ADDR EshellHostAddr;     // Host端的IP地址和EShell的UDP端口號
    EDBG_ADDR DbgHostAddr;        // IP地址和接收Debug信息的UDP端口號
    EDBG_ADDR CeshHostAddr;       // IP地址和以太網cesh的UDP端口號
    EDBG_ADDR KdbgHostAddr;       // IP地址和Kenel Debugger的UDP端口號

    ETH_HARDWARE_SETTINGS   Edbg; // 調試以太網卡的硬件設置信息
} BOOT_ARGS, *PBOOT_ARGS;

其中Boot loader的設置標誌定義如下:


#define    LDRFL_USE_EDBG     0x0001  // 設置嘗試使用調試以太網
//如果設置了LDRFL_USE_EDBG,下面兩個標誌纔會被看到
#define    LDRFL_ADDR_VALID  0x0002  // 當EdbgAddr有效時設置
#define    LDRFL_JUMPIMG      0x0004  // 不使用與Eshell通信


在上面的BOOT_ARGS結構中的ETH_HARDWARE_SETTINGS結構定義如下:


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

    char szPlatformString[EDBG_MAX_DEV_NAMELEN];   //一個唯一的目標板設備名

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

可以看出,最終這塊在EBOOT和WinCE之間的共享內存是使用Driver Globals的數據結構來描述的,並事先在eboot.bib和config.bib中預留了這塊內存。最終達到相互共享數據的目的。

發佈了6 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章