zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    80386寄存器
    删除 Windows 旧 OS 加载器
    [C#] Socket 通讯,一个简单的聊天窗口小程序
    [erl] erlang 进程注册和注销
    VB中 '&' 和 '+' 号的区别
    如何成为一个牛逼的程序员
    [VB] if 判断语句 和 If、IIf函数的比较
    C#中通过反射方法获取控件类型和名称
    薪资至少10K的一道题,你能拿下吗
    Jass 技能模型定义(—):半人马酋长的反击光环
  • 原文地址:https://www.cnblogs.com/dahai/p/1788084.html
Copyright © 2011-2022 走看看