TOC与WinCEOS引导

TOC(Table of Content)是用于描述OS image的结构体,一般存在flash的某一Block中,系统启动时,由Eboot(OEMPlatformInit—>TOC_Read)读取该Block获取Image相关信息(起始地址,长度,虚拟启动地址等),从而启动OS。因此TOC对OS的启动至关重要。下面是TOC的详细描述:

 

  
    
1 typedef struct _TOC {
2 DWORD dwSignature; // TOC的验证码
3   BOOT_CFG BootCfg; // Image引导配置,网络设备地址。。。
4   IMAGE_DESCRIPTOR id[MAX_TOC_DESCRIPTORS]; // Image描述数组
5   CHAININFO chainInfo; // 多个Image bin时的链接信息,和chain.bin有关吧?
6   } TOC, * PTOC; // 512 bytes  

其中比较重要的就是IMAGE_DESCRIPTOR了:

  
    
1 typedef struct _IMAGE_DESCRIPTOR {
2 DWORD dwVersion; // 编译时的版本号
3   DWORD dwSignature; // “EBOOT”或“CFSH”等
4   UCHAR ucString[IMAGE_STRING_LEN]; // 描述字符串:如"eboot.nb0"之类
5  
6 DWORD dwImageType; // image的类型nk.nb0为0x04
7   DWORD dwTtlSectors; // image文件用到的NAND的扇区总数
8  
9 DWORD dwLoadAddress; // image加载时的虚拟地址
10   DWORD dwJumpAddress; // image加载完成后的跳转地址
11  
12 SG_SECTOR sgList[MAX_SG_SECTORS]; // image的段描述,包括起始扇区号和所需扇区数目
13   ULONG dwStoreOffset;
14 } IMAGE_DESCRIPTOR, * PIMAGE_DESCRIPTOR;  

其它的结构体:

 

  
    
1 typedef struct _BOOTCFG {
2
3 ULONG ImageIndex;
4 ULONG ConfigFlags;
5 ULONG BootDelay;
6 EDBG_ADDR EdbgAddr;
7 ULONG SubnetMask;
8
9 } BOOT_CFG, * PBOOT_CFG;
10
11
12 typedef struct _CHAININFO {
13
14 DWORD dwLoadAddress; // Load address in SDRAM
15   DWORD dwFlashAddress; // Start location on the NAND
16   DWORD dwLength; // The length of the image
17   } CHAININFO, * PCHAININFO;  

 

这个CHAININFO应该是和multi bin有关,用来通过binfs动态加载其它bin文件。

 

还是直接看串口打印信息比较直观:

To start Launch OS! List TOC table :

TOC {

dwSignature: 0x 434F 544E

BootCfg {

 ConfigFlags: 0x0

 BootDelay: 0x5

 ImageIndex: 0

  IP: 0.0.0 .0

  MACAddress: 00:00:00:00:00:00

  Port: 0.0.0 .0

 SubnetMask: 0.0.0 .0

}

ID[0] {

 dwVersion: 0x1

 dwSignature: 0x43465348

 String: ''

 dwImageType: 0x2

 dwTtlSectors: 0x9FAC

 dwLoadAddress: 0x80200000

 dwJumpAddress: 0x 80206F 90

 dwStoreOffset: 0x0

 sgList[0].dwSector: 0x3020

 sgList[0].dwLength: 0x9FAC

}

chainInfo.dwLoadAddress: 0X00000000

chainInfo.dwFlashAddress: 0X00000000

chainInfo.dwLength: 0X00000000

}

INFO: OEMLaunch: Jumping to PhysicalAddress 0x 30206F 90h(Virtual Address 0x 80206F 90h)...

可以明显看到这个跳转的虚拟地址就是TOC中存储的地址。

有个疑问:那这个TOC的信息是怎么来的?应该是从bin文件来的,在Eboot烧录时解析出来然后写入TOC的相应Block中。详细情况,再追追看吧 :)

 

参考:http://blog.chinaunix.net/u1/38994/showart_303466.html

你可能感兴趣的:(WinCE)