• 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

  • 相关阅读:
    MY_0003:设置界面显示单位
    H5_0024:对于事先无法确定css大小的情况,可以通过JS动态修改
    H5_0023:html页面禁止放大缩小页面
    MY_0002:导出单位设置
    MY_0001:添加命令到自定义工具栏
    H5_0020:判断安卓苹果平台
    Web_0003:关于PHP上传文件大小的限制
    H5_0019:JS中定义json结构
    H5_0018:z-index失效的原因
    H5_0017:通过元素自定义属性值获取元素对象,并获取属性值
  • 原文地址:https://www.cnblogs.com/dahai/p/1788084.html
Copyright © 2020-2023  润新知