WinCE EBOOT中的Boot Args与Driver Globals

作者:ARM-WinCE

 

EBOOT中包含的一个重要的缓冲区叫Driver Globals,它用于在设备驱动和WinCE OS之间共享数据。而在EBOOT中会用到的启动参数结构被称为Boot Args,是指用于EBOOTWinCE OS之间共享一些参数信息。一般来说Boot Args会在EBOOT运行的时候被赋值或者更新,最常用的就是网络设备的相关信息设置,比如IP地址,MAC地址,中断等信息。

 

Driver Globals包含了Boot Args,也就是说Driver Globals是一块内存缓冲区,其中里面也包含了Boot Args的内存缓冲区。这里要说明的是Driver Globals是一个可选用的功能,无非就是一块内存,在EBOOTWinCE OS之间进行数据共享。如果你想用,你就用,不想用,也可以不用。我们在使用Driver Globals的时候,一般会在eboot.bibconfig.bib文件定义一块预留的内存区域,在这两个文件中定义的这块内存区域的起始地址和大小必须一致,相信这个大家都能理解,至于类型肯定是RESERVED。这样一来,在EBOOTWinCE运行的时候,这块共享内存就被预留出来了。当然,我们还需要在BSP中通过宏定义来定义这块内存的起始地址和大小,这样就可以在BSP中访问这块内存了。举例:

 

首先在eboot.bibconfig.bib都要有下面的定义:

  1. MEMORY
  2. ;   Name     Start     Size      Type
  3. ;   -------  --------  --------  ----
  4.    ARGS     80020800  00000800  RESERVED

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

 

 

然后还要在BSP中对其起始地址和大小进行宏定义,如下

  1. #define IMAGE_SHARE_ARGS_UA_START       0xA0020000
  2. #define IMAGE_SHARE_ARGS_CA_START       0x80020800
  3. #define IMAGE_SHARE_ARGS_SIZE           0x00000800

这样,EBOOT就可以通过上面的宏定义的地址来访问共享内存了。这块共享区域是用Driver Globals结构来描述的,具体定义如下:

  1. typedef struct _DRIVER_GLOBALS
  2. {
  3.     //
  4.     // 之后,可以定义用于驱动程序和WinCE OS之间的共享信息
  5.     //
  6.     BOOT_ARGS        bootargs;
  7. } DRIVER_GLOBALS, *PDRIVER_GLOBALS;  

可以看出里面包含了用于描述Boot ArgsBOOT_ARGS结构,当然用户也可以在结构中添加用于驱动和WinCE OS之间共享的数据类型。

 

下面介绍一下Boot ArgsBOOT_ARGS结构,定义如下:

  1. #define BOOTARG_SIG  0x544F4F42 // "BOOT"
  2. typedef struct BOOT_ARGS
  3. {
  4.     DWORD   dwSig;
  5.     DWORD   dwLen;                // BOOT_ARGS的结构长度
  6.     UCHAR   ucLoaderFlags;        // Boot loader设定的标志
  7.     UCHAR   ucEshellFlags;        // EShell标志
  8.     DWORD   dwEdbgDebugZone;      // 调试域Debug Zone的定义
  9.     EDBG_ADDR EshellHostAddr;     // Host端的IP地址和EShell的UDP端口号
  10.     EDBG_ADDR DbgHostAddr;        // IP地址和接收Debug信息的UDP端口号
  11.     EDBG_ADDR CeshHostAddr;       // IP地址和以太网cesh的UDP端口号
  12.     EDBG_ADDR KdbgHostAddr;       // IP地址和Kenel Debugger的UDP端口号
  13.     ETH_HARDWARE_SETTINGS   Edbg; // 调试以太网卡的硬件设置信息
  14. } BOOT_ARGS, *PBOOT_ARGS;

其中Boot loader的设置标志定义如下:

  1. #define    LDRFL_USE_EDBG     0x0001  // 设置尝试使用调试以太网
  2. //如果设置了LDRFL_USE_EDBG,下面两个标志才会被看到
  3. #define    LDRFL_ADDR_VALID  0x0002  // 当EdbgAddr有效时设置
  4. #define    LDRFL_JUMPIMG      0x0004  // 不使用与Eshell通信

在上面的BOOT_ARGS结构中的ETH_HARDWARE_SETTINGS结构定义如下:

  1. typedef struct _ETH_HARDWARE_SETTINGS
  2. {
  3.     EDBG_ADAPTER    Adapter;             // 与Platform Builder通信的网卡
  4.     UCHAR           ucEdbgAdapterType;   // 调试以太网卡的类型
  5.     UCHAR           ucEdbgIRQ;           // 调试以太网卡的IRQ
  6.     DWORD           dwEdbgBaseAddr;      // 调试以太网卡的基地址
  7.     DWORD           dwEdbgDebugZone;     // 调试以太网卡的调试域
  8.     char szPlatformString[EDBG_MAX_DEV_NAMELEN];   //一个唯一的目标板设备名
  9.     UCHAR           ucCpuId;             // 处理器类型
  10. } ETH_HARDWARE_SETTINGS, *PETH_HARDWARE_SETTINGS;

可以看出,最终这块在EBOOTWinCE之间的共享内存是使用Driver Globals的数据结构来描述的,并事先在eboot.bibconfig.bib中预留了这块内存。最终达到相互共享数据的目的。

 

 

 

 

你可能感兴趣的:(数据结构,网络,OS,WinCE)