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: 0x434F544E

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: 0x80206F90

 dwStoreOffset: 0x0

 sgList[0].dwSector: 0x3020

 sgList[0].dwLength: 0x9FAC

}

chainInfo.dwLoadAddress: 0X00000000

chainInfo.dwFlashAddress: 0X00000000

chainInfo.dwLength: 0X00000000

}

INFO: OEMLaunch: Jumping to PhysicalAddress 0x30206F90h(Virtual Address 0x80206F90h)...

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

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

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

原文地址:https://www.cnblogs.com/dahai/p/1788084.html