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
BootCfg {
ConfigFlags: 0x0
BootDelay: 0x5
ImageIndex: 0
IP:
MACAddress: 00:00:00:00:00:00
Port:
SubnetMask:
}
ID[0] {
dwVersion: 0x1
dwSignature: 0x43465348
String: ''
dwImageType: 0x2
dwTtlSectors: 0x9FAC
dwLoadAddress: 0x80200000
dwJumpAddress: 0x
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
可以明显看到这个跳转的虚拟地址就是TOC中存储的地址。
有个疑问:那这个TOC的信息是怎么来的?应该是从bin文件来的,在Eboot烧录时解析出来然后写入TOC的相应Block中。详细情况,再追追看吧 :)