• WINCE应用BINFS


     

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

    作者:LoongEmbedded(kandi)

    时间:2012.03.02

    类别:WINCE系统开发

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

    1.    BINFS概述

    BINFS(Binary ROM Image File System)是可以读取由Romimage.exe生成的.bin文件的二进制ROM镜像文件系统。.bin文件格式以具体的section来组织数据,每section有一个section头,此部分包含这section的开始地址、长度和检验码,见下图:

     

    图1

    Romimage.exe把逻辑section,比如一个应用程序的text或是.data区域的数据写到.bin文件中。

    为了能在块驱动(block driver)的上层加载BINFS,我们必须在storage profile注册表项下面加入(enter)块驱动相应的注册表键,如下所示,下面的示例注册表信息表示我们可以增加自己块驱动的storage profile来指定BINFS为默认的文件系统。

    ; Bind BINFS to the block driver

    [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFlash]

           "DefaultFileSystem"="BINFS"

           "PartitionDriver"="mspart.dll"

           "AutoMount"=dword:1

           "AutoPart"=dword:1

           "MountFlags"=dword:11

           "Folder"="ResidentFlash"

           "Name"="Samsung Flash Disk"

           "BootPhase"=dword:0

              

    [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFlash\BINFS]

        "MountHidden"=dword:1

    "MountAsROM"=dword:1

    2.    如何应用(implemnet)BINFS

    我们可以应用BINFS在NAND或NOR闪存上来读取.bin文件。BINFS为最终的用户(end user)解析每个区域(比如xipkernel,nk.bin).bin文件的记录(record),为了使用BINFS,我们必须在bootloader中增加multi-bin区域技术,初始之外,还需要对config.bib文件进行必要的修改,从而使BINFS可以正确读取我们的运行时镜像文件。

    为了应用BINFS,必须做下面的处理:

    2.1  在bootloader中增加对BINFS的支持

    如果一个bootloader包含对BINFS的支持,那么bootloader能够分区、格式化和写数据到存储介质中。Bootloader使用Bootpart库(bootpart.lib)来向闪存写数据和创建分区,在同一个储存设备中需要创建BINFS和其他文件格式(比如是FAT)的分区。Bootloader使用Bootpart库中的BP_OpenPartition()函数来创建BINFS分区和扩展分区。因为一旦Bootpart库对闪存进行了分区,那么OS就不能修改MBR(master boot record),所以OS需要这个扩展分区来创建一个或多个数据分区。

    Bootpart库能够创建一个保存引导参数(boot parameter)的引导分区,闪存的块包含MBR扇区(sector)、BINFS存储区域、引导参数分区(根据需要来决定,可选)和扩展分区,如下图:

     

    图2

    BIFS和引导参数分区是只读,所以不能被格式化或删除。

    对于bootloader,Bootpart使FMD(flash media driver)的代码比较抽象,这样使得bootloader创建一个分区和指定分区中的数据偏移量就可以进行读或写了,另外Bootpart还可以对闪存进行低层格式化(low-level format)。

    2.2  修改config.bib的MEMORY部分来支持BINFS

    为了应用BINFS,我们必须安装下面的步骤来config.bib下面的内容:

    ⑴     加扩展区域(这里是指NK.bin,也即除了最小内核xipkernel.bin之外的其他OS部分)并且设置其类型为NANDIMAGE,这样可以防止把扩展区域的地址空间分配为RAM,config.bib中的示例配置如下图所示:

     

    图3

    镜像内核xipkernel为RAMIMAGE,见图3,xipkernel区域是为支持BINFS能够读取存储器上BINFS分区数据所需要的最小内核。因为这个内核必须存在于(reside in)RAM中和它是RAMIMAGE类型,所以包含在典型的情况下,xipkernel区域包含内核所需要的文件,而且xipkernel区域(xipkernel.bin)中必须包含下面的模块:

    ?     Nk.exe

    ?     Kernel.dll

    ?     Coredll.dll

    ?     K.coredll.dll

    ?     Oalioctl.dll

    ?     Filesys.dll

    ?     Fsdmgr.dll

    ?     Mspart.dll

    ?     Romfsd.dll

    ?     Binfs.dll

    ?     Default.fdf or boot.hv

    ?     Fpcrt.dll (ARM-only)

    ?     Ceddk.dll (if required by your flash driver)

    ?     Your flash driver

    ⑶如果我们的flash驱动被设备管理器加载,那么还需要增加device.dll、devmgr.dll、regenum.dll、busenum.dll和pm.dll到xipkernel中。

    ⑷如内核支持KITL,那么也需要把kitl.dll包含进来。

    ⑸如要支持debug,需要增加hd.dll、osaxst0.dll和osaxst0.dll到xipkernel。

    ⑹把其他剩下部分(remaining items)包含到扩展区域(nk.bin)。

    2.3  修改config.bib的CONFIG部分来支持BINFS

    config.bib中CONFIG部分必须指定RAM_AUTOSIZE=OFF和ROM_AUTOSIZE=OFF,XIPSCHAIN的值表示chain区域(chain.bin)的起始地址,这个值必须要和MEMORY部分指定的值一致,我们的BSP包中config.bib这部分内容如下:

     

    图4

    2.4  修改common.bib文件

    如果我们的OS支持用户模式驱动(User Mode Drivers),要修改common.bib文件中驱动模块为非页对齐的(non-pageable)。WINCE6.0支持设备驱动运行在用户模式下,可是,如果导出PowerUp或PowerDown函数的用户模式驱动和驱动代码要求页对齐(demand-paged), BINFS分区中有这种类型的驱动,或是这种类型驱动在.bib文件的FILE部分,或是这种驱动保存在外部存储器中(external storage),这些情况都会发生页缺陷出错(a page fault error may occur)。

    为了在BINFS中支持用户模式驱动,我们必须修改common.bib文件中这些模块的属性,内容如下:

    ⑴获取需要跟新模块的列表。

    使用 findstr /m “PowerDown” *.map查找导出PowerUp和PowerDown函数的驱动,如下图:

    图5

    ⑵打开common.bib文件。

    ⑶通过上面命令找到的驱动,然后相应在common.bib文件中添加M标识以表示此模块是非页对齐的(non-pageable),如下所示:

    coredll.dll $(_FLATRELEASEDIR)\coredll.dll XIPKERNEL SHM

    ⑷保存common.bib文件。

    另外在common.reg中需要增加下面的内容

    [HKEY_LOCAL_MACHINE\System\StorageManager\PartitionTable]

       "20"="BOOT"

       "21"="BINFS"

  • 相关阅读:
    简单的实现UIpicker上面的取消确定按钮
    ios 笔记
    KVO 简单使用
    iOS 返回到根目录实现
    ios 实现简单的断点续传下载 nsurlconnection
    cocos2d 安装mac
    iOS 自定义自动锁屏时间
    PHP面向对象——单例模式
    PHP面向对象——构造函数、析构函数
    PHP面向对象——多态
  • 原文地址:https://www.cnblogs.com/liang123/p/6325695.html
Copyright © 2020-2023  润新知