首先在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中预留了这块内存。最终达到相互共享数据的目的。