zoukankan      html  css  js  c++  java
  • WINCE6.0 chain.bin和xipkernel.bin解析

     

    ********************************LoongEmbedded********************************

    作者:LoongEmbedded(kandi)

    时间:2012.03.08

    类别:WINCE系统开发

    ********************************LoongEmbedded********************************

    1. Multiple XIP模式的文件说明

    Multiple XIP模式下生成的文件有chain.bin、chain.lst、NK.bin、xip.bin和xipkernel.bin,如下图所示:

    图1

    1.1   chain.lst和chain.bin文件

    ⑴chain.lst文件

    chain.lst文件定义了要把哪些bin文件下载到flash上,以及这些bin文件的下载顺序,我们用UltraEdit打开chain.lst文件,内容如下:

    +XIPKERNEL.bin

    NK.bin

    chain.bin

    表示要把这些bin文件下载到NAND FLASH中,依次下载XIPKERNEL.bin、NK.bin和chain.bin,这个下载的顺序是在config.bib文件中指定的,见此文件的相关部分:

     

    图2

    ⑵chain.bin文件

    在\WINCE600\PRIVATE\WINCEOS\COREOS\NK\TOOLS\ROMIMAGE\remdme.txt下有描述bin文件的结构体定义:

    Formats:

      struct BinFile{

        BYTE signature[7];     // = { 'B', '0', '0', '0', 'F', 'F', '\a' }

        DWORD   ImageStart  //此bin文件在DRAM中的起始地址(虚拟地址)

        DWORD   ImageLength //此bin文件的长度,以字节为单位

        Record  ImageRecords[ImageLength] //存放此镜像文件二进制数据的记录

      };

      struct Record{

        DWORD address;//此记录的起始地址

        DWORD length;//此记录的长度,以字节为单位

        DWORD chksum;//此记录所有的数据的检验码

      };

    下面先通过viewbin –r nk.bin >chain_rec.txt来从大局上了解chain文件的主要信息:

     

    图3

    接下面用UltraEdit打开chain.bin文件来看其中的详细信息:

     

    图4

    为了进一步帮助理解bin文件的格式和内容,通过viewbin –d nk.bin >chain_data.txt来看其中对应的一部分内容:

     

    图5

    上图中涉及到一些重要的结构体,在\WINCE600\PUBLIC\COMMON\OAK\INC\Romldr.h中定义,如下:

     

    图6

    结合这些结构体的定义,我们再来通过viewbin –d nk.bin >chain_data.txt看其中的内容可以进一步理解chain.bin文件的格式和内容,下图是我把中间大部分为0的数据去掉之后的内容:

     

    图7

    由上面可知chain.bin文件实际的数据大小为0x528=1320个字节,但我们通过chain.bin的属性看到其大小为1363个字节

    图8

    1363这个值就是chain.bin实际有效的数据+maginc number+Image Start+length+record[0]. Start+ record[0]. Length+ record[0]. Chksum+ record[1]. Start+ record[1]. Length + record[1]. Chksum+ record[1]的结束符标志=1320+7+4+4+4+4+4+4+4+4+4=1320+7+9*4=1363个字节。

    由上面这些猫描述可知chain.bin文件的格式及内容如下:

     

    图9

    由上图介绍可知chain.bin文件的内容包含XIP chain(链)中有几个XIP区域(也即bin文件),每个bin被装载在RAM中的起始地址,bin文件的大小等信息,可参考图6的结构体描述,另外,在\WINCE600\PRIVATE\WINCEOS\COREOS\NK\TOOLS\ROMIMAGE\remdme.txt中有下面的描述,有助于深入理解:

     

    图10

    1.2   xipkernel.bin文件

    TOC是对于.bib文件的MODULES来说的,每个MODULES下的部分,比如dll或是exe都对应一个TOC入口,相应的结构体为TOCentry,在Romldr.h中定义;对于bib文件下的FILES部分下的文件,如wince.nls和boot.hv均对应一个文件,相应的结构体为FILESentry,也在Romldr.h中定义。

    先看\WINCE600\PRIVATE\WINCEOS\COREOS\NK\TOOLS\ROMIMAGE\remdme.txt中bin文件格式的相关描述:

     

    图11

    下面我们来看xipkernel.bin被解压到内存中的布局和xipkernel.bin文件内容在flash中的存储布局:

     

    图12

    由上图上半部分可知record[0]和record[1]的数据在内存中的地址并不是连续的,而且可以看出它们之间有0x80100040-(0x80100000+4)=0x36个字节的间距,其他record之间可能有也可能没有间距,但不会重叠。由上图下半部分,可以总结如下:

    图13

    那这里record[3:n]的数据都是些什么内容呢?由图12可知pTOC = 0x80347864,那我们就来看此地址开始的内存处保存的内容(结合图11可知这就是ROMHDR结构体的内容),ROMHDR结构体在Romldr.h中定义,下面就把它的定义贴出来:

     

    图14

    接着结合xipkernel.bin中这部分的内容:

     

    图15

    结合图14和图15的内容,我们来详细学习ROMHDR结构体的成员变量的含义:

    Dllfirst:

    dllfirst=0x4001C001,表示分配给操作系统镜像xipkernel.bin的动态链接库使用的ROM DLL虚拟地址区间的起始地址,在WINCE6.0中,0x40000000到0x5FFFFFFF这512MB的虚拟内存空间被定为ROM DLL区间,这里此值为0x4001C001。

    Dlllast:

    dlllast=0x400FC027,表示分配给操作系统镜像xipkernel.bin的动态链接库使用的ROM DLL虚拟地址区间的结束地址,也就是说为此镜像文件分配的ROM DLL虚拟内存大小为0x400FC027-0x4001C001=0x000E0026,还不到1MB的空间

    physfirst:

    physfirst=0x80100000,表示镜像文件被装载到RAM中的起始地址。

    Physlast:

    physlast=0x80410774,表示镜像文件被装载到RAM中的结束地址,它等于Image Start+ length,见下图:

     

    图16

    Nummods:

    Nummods=0x0000001E,表示镜像文件中包含的模块个数,也就是好.bib文件中MODULES部分包含的模块个数,这也就是TOC entry的数量,那么很显然每个模块都需要用一个TOCentry结构体来描述模块(比如nk.exe或是coredll.dll)的相关信息了。

    ulRAMStart:

    ulRAMStart=0x80500000,表示RAM程序内存的起始地址,这块区域不包括被系统保留部分的,也不包括被用于对象存储的空间,用于操作系统及应用程序在运行过程中动态分配以存放系统及程序运行数据的RAM空间,为了更好理解此结构体,见config.bib通用RAM区域的设置:

     

    图17

    ulRAMFree:

    ulRAMFree=0x80579000,表示RAM的程序内存空闲空间的起始地址,指的是可以动态分配给程序运行时使用的空间,根据我的理解,在ulRAMStart 到ulRAMFree这个区域主要用于存放xipkernel.bin全局变量重定位时搬移的数据。

    ulRAMEnd:

    ulRAMEnd=0x866600000,表示RAM程序内存的结束地址。

    ulCopyEntries:

    ulCopyEntries=0x00000003,表示全局变量重定位时需要搬移的条目数。

    ulCopyOffset:

    ulCopyOffset=0x802F4BF4,表示全局变量重定位时搬移条目的偏移地址。

    ulProfileLen:

    ulProfileLen=0x00000000,表示用于profile调试功能的入口信息的长度。

    ulProfileOffset:

    ulProfileOffset=0x00000000,表示用于profile调试功能的入口信息的偏移地址。

    Numfiles:

    Numfiles=0x00000002,,表示此镜像文件中包含的文件数量,这部分在bib文件的FILES部分指定。

    ulKernelFlags:

    ulKernelFlags=0x00000000,由config.bib中的ROMFLAGS配置的值指定,指定内核可选的Flag的位掩码(bitmask),它的值可以是下面这些值的组合:

    Flag       Description

    0x00000001    Demand paging is disabled.

    0x00000002    Disable full-kernel mode.

    0x00000010    Trust only modules from the ROM MODULES section.

    0x00000020    Use this flag to stop flushing soft TLB (x86 only).

    0x00000040    Honor the /base linker setting for DLLs.

    ulFSRamPercent:

    ulFSRamPercent=0x80808080,由config.bib中的FSRAMPERCENT的值来指定,但如果没有config.bib中没有指定FSRAMPERCENT的值,那就默认为0x80808080,指定分配给文件系统做存储空间的RAM占整个除去RESERVED和RAMIMAGE指定的空间之外的RAM空间的百分比。这个百分比是这样计算的:第一个1MB内存保留了128(0x80)个4KB大小的页用于文件系统的存储,第而个1MB内存保留了128(0x80)个4KB大小的页用于文件系统的存储,第三个1MB内存保留了128(0x80)个4KB大小的页用于文件系统的存储,第四个1MB内存保留了128(0x80)个4KB大小的页用于文件系统的存储。这样分配给文件系统的RAM内存空间占用的百分比=(128+128+128+128)*4*4KB/4MB=50%。

    ulDrivglobStart:

    ulDrivglobStart=0x00000000,表示设备驱动程序所用全局变量的起始存储地址。

    ulDrivglobLen:

    ulDrivglobLen=0x00000000,表示设备驱动程序所用全局变量占用内存的字节数。

    usCPUType:

    usCPUType=0x01C2,表示镜像文件运行所在的CPU类型。

    usMiscFlags:

    usMiscFlags=0x0002,镜像文件的混合标记(Miscellaneous flag)选项。

    pExtensions:

    pExtensions=0x80101790,指向存放ROMHDR扩展数据的内存区域,此区域对应于结构体ROMPID,如下图所示:

     

    图18

    ulTrackingStart:

    ulTrackingStart=0x00000000,Tracking调试功能所用内存区域的起始地址。

    ulTrackingLen:

    ulTrackingLen=0x00000000,Tracking调试功能所用内存区域的长度。

    Xipkernel.bin的内容还涉及很多结构体及知识点,下部分学习eboot下载并加载xipkernel.bin,nk.bin文件的时候再深入了。

  • 相关阅读:
    【Unity学习笔记】Unity网络游戏开发实战(一)---网络编程的开端:Echo程序
    【DX11学习笔记】GerstnerWave波浪模拟(基于GPU计算着色器的实现)
    【DX11学习笔记】粒子系统--爆炸特效
    【设计模式】(二)观察者模式是什么?
    【设计模式】(一)工厂模式是什么?
    【C++笔记】C++中常见智能指针auto_ptr、unique_ptr、shared_ptr和weak_ptr的用法
    【C++笔记】C++关联容器set和map的概述和操作
    【C++笔记】C++函数模版与类模版
    【C++笔记】C++中vector、stack、deque、list的简易实际使用方法
    python之赋值、浅拷贝、深拷贝
  • 原文地址:https://www.cnblogs.com/liang123/p/6325694.html
Copyright © 2011-2022 走看看