S3c2440A平台HIVE注册表+binfs的实现

转载 2007年10月08日 17:18:00

其实所有的工作都是改注册表,但是怎么改,为什么这么改要搞懂就蛮费一番心思了,好在俺是喜欢钻研的动物,

我们的案子是基于samsung S3C2440Asamsung ONENAND+WinCE5.0的,开发平台是platform builder 5.0,首先我们基于RAM registerimage已经可以正常跑起来了,Flash除了放置image外其他的空间为用户提供文件系统,这部分的驱动程序是用三星的PocetStoreII15

先来回味一下底层的东东,我们的Image主要由两部分组成:XIPKERNEL.binNK.bin,XIPKERNEL.bin中的东西就是那些WinCE中比较核心的又需要经常加载的一些程序和DLL文件,这些文件会被Boot Loader在刚启动的时候拷贝到RAM中去,这样就可以在RAMXIPExcute in place)了。在NK.bin中的基本上是需要但不至于要常驻内存的一些程序和DLL了,比如我们BuildIn下的大部分驱动,比如微软的IEmediaplayer等应用程序,甚至连设备管理器device.exe也可以放到这里面,这些文件只有在需要的时候才被复制到内存中去执行,节约了内存并且也加快了启动的时间。嘿,到这里大概知道binfs的工作原理和重要性吧。

binfs
的建立工作是在用UTOEM自己的一种底层的工具集)实现的,UT在烧image的时候会自动把XIPKERNELNK分别保存到flash的特定的逻辑扇区上.启动的时候Boot Loader会先把XIPKERNEL复制到RAM中,然后跳到RAM中的XIPKERNEL的入口点去执行,这个时候会跑一些OEMinit之类的CPU,内存,中短等初始化的过程,接着OS会从注册表中找到binfs的一些设置,然后加载binfs的驱动使binfs分区对OS来讲是可用的,假如device.exe是在NK.bin中的话,那么在这个时候就可以用/binfs/device.exe/binfs是假设的装载路径)来调用它了,如果这个时候binfs没有初始化成功那么,device.exe得不到执行,那么系统肯定就起不来了。

现在来讲讲HIVE,其实HIVE是个很简单的东西,都怪和binfs牵到一起搞得很多问题都走错了方向,本来一天就能搞定结果搞了四五天,NND。这么说吧,WinCE下面就两种注册表,一种是RAM based,另外就是HIVE based了,缺省用的是前者,如果用前者PB会在编译的时候把common.regplatform.reg的内容做到一个叫reginit.ini的文件然后压缩成default.***(忘记扩展名了,有过老迹象了哈)的文件放到XIPKERNEL中去,image在起来的时候会把这个文件解压到RAM中形成RAM based注册表,既然是RAM based那么所有的改动都会在断电后蒸发,哈哈。怎么办呢?其实再笨你也能想出来,保存到磁盘上不就结了吗!?对你太聪明了,但是你想如果你把注册表全放到磁盘(SDMMCHDDFlash)上WinCE怎么在没有加载你磁盘的驱动的情况下读到注册表呢?而一般情况加载磁盘的驱动程序也是要注册表的支持啊!嘿,对了,这就是HIVE想到的,看它怎么做,它把注册表分成两部分(其实是三部分,当时大体还是两步分,把user.hvsystem.hv做一部分),第一部分就是叫做boot.hv的注册表,里面的东西就是一些在没有拿到保存在磁盘的注册表之前引导时需要的一些设置,这部分的注册表和RAM based的是一样的,改了之后断电就没了,所以这部分的注册表项都是不需要改动的,需要改动的都放到第二部分就是了,这第二部分就是system.hvuser.hv了,也就是一直提到的要放到磁盘上的注册表. 编译的时候PB会根据platform.regCommon.reg中的标签判断哪些表项放到boot.hv中,这个标签就是;HIVE BOOT SECTION ;END BOOT SECTION,夹在这个标签之间的表项PB在编译的时候会把它们塞到boot.hv中去(boot.hv是二进制文件,要看里面到底放了哪些表项用一个老外写的工具吧,好像叫d_readvol.exe,到google上找得到的),其他的内容会分别塞到default.hvuser.hv中去,最后会把这三个hv文件统统塞到XIPKERNEL中去,这样WinCE在引导的第一阶段就把所有的hv扔到RAM中去了,然后打开boot.hv拿到必要的资料,这其中包括如何加载放置system.hv的磁盘的驱动,所以那些和加载这个磁盘相关的驱动要统统放到boot.hv中,比如FAT文件系统驱动,mspart分区驱动等等,这里有一点很重要就是假如你用binfs而且device.exeNK.bin中,那么一定在第一阶段要保证binfs可用,否则这里就不可能为system.hv创造条件了。WinCE第一次启动时候磁盘上没有东东,这个时候WinCE会将内存中的default.hvuser.hv复制到注册表BootVars指定的地方,default.hv往往会被重命名为system.hv,第二次启动会先检查磁盘上的hv是不是和内存中的一致,不一致就加载磁盘上的表项。

整个过程就是这样子,但要注意一点,HIVE注册表也是在内存中运行的,不同的是启动的时候会从磁盘上去读改动的表项,因为这样才能保证速度,所以你做的的注册表改动也是在内存中做的,这个时候如果你不掉用FlushRegister去将内存中的数值保存到磁盘上那么这些改动还是会丢失的。两种方法来避免丢失,一种是认为去调用FlushRegister,令一种就设置一个flagWinCE在每次改动注册表后自动Flush.

最后总结一下我到底做了哪些事情:
1
)在PB中将HIVEbased Registers拉到项目的WorkSpaces中来。
2
)把Platform.reg中的下列表项加到boot.hv
3
Build Image

附上我的注册表设置做参考:

;-----------------------------------------------------------------------------------------
;ALL these entries below will be add to boot.hv when hive register is enabled!
;HIVE BOOT SECTION

[HKEY_LOCAL_MACHINE/init/BootVars]
"SYSTEMHIVE"="Documents and Settings//system.hv"       ;system.hv
会保存到/HDD/Documents and Settings/system.hv
;"PROFILEDIR"="Documents and Settings"   ;user.hv
会保存到/HDD/Documents and Settings/default/user.hv
"Start DevMgr"=dword:1     ;
这个说是启动device.exe,但是wince 5.0好像不用这个
"DefaultUser"="default"         ;
咱们只有一个用户default,基本上就是决定user.hv的路径了
"Flags"=dword:3  ;
这个应该是wince 5.0下决定在哪个阶段启动device.exe的表项
"RegistryFlags"=dword:1     ;
这个就是设置注册表每次改动后自动flushsystem.hv

;###########################################################################
;
这个部分是binfs的注册表项,如果你不是用的binfs那么不用将它们拉到boot.hv
[HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/SMFlash]
"DriverPath"="Drivers//BlockDevice//SMFlash"
"LoadFlags"=dword:1
"MountFlags"=dword:11
"BootPhase"=dword:0
  "Flags"=dword:1000
[HKEY_LOCAL_MACHINE/Drivers/BlockDevice/SMFlash]
"Prefix"="DSK"
"Dll"="BIBDrv.dll"
"Order"=dword:0
"Ioctl"=dword:4
"Profile"="SMFlash"
"FriendlyName"="Samsung Flash Driver"
"MountFlags"=dword:11
"BootPhase"=dword:0
  "Flags"=dword:1000
; Bind BINFS to the block driver
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/SMFlash]
"DefaultFileSystem"="BINFS"    ;binfs
的路径为/BINFS
"PartitionDriver"="mspart.dll"
"AutoMount"=dword:1
"AutoPart"=dword:1
"MountFlags"=dword:11
"Folder"="ResidentFlash"
"Name"="Samsung Flash Disk"
"BootPhase"=dword:0
  "Flags"=dword:1000
  "MountHidden"=dword:0    ;
有了这个你就可以在/BINFS目录下看到所有的NK.bin的东东了
  
  ;###########################################################################

;###########################################################################
;
这个部分是设置保存system.hv的磁盘的驱动程序,每个人不一样了,但是大同小异
;
我这里用的是PoketStroeII15Flash驱动,system.hv保存在第一个Flash分区上
IF BSP_POCKETSTORE
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/PocketStore]
   "Prefix"="DSK"
   "Dll"="ONDisk.dll"
   "Order"=dword:1
   "Profile"="PocketStore"
   "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
   "BmlVolumeId"=dword:0  ; BML volume ID = 0
   "BmlPartitionId"=dword:8 ; BML parition ID = PARTITION_ID_FILESYSTEM
   "Index"=dword:2      
   "Flags"=dword:1000     ;
这个flag指定这个驱动只在boot.hv中加载一次
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/PocketStore]
    "DefaultFileSystem"="FATFS"
    "PartitionDriver"="mspart.dll"
    "AutoMount"=dword:1
    "AutoPart"=dword:1
    "AutoFormat"=dword:1
    "MountAsBootable"=dword:1   ;
这个是wince 5.0下指定这个分区保存system.hv的关键
    "Folder"="HDD"
    "Name"="NAND Drive"
    "Ioctl"=dword:4
   
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/PocketStore/FATFS]
    "EnableCacheWarm"=dword:0
   
ENDIF

 

【ARM学习笔记】三、S3C2440A的存储控制器及启动过程

存储控制器 S3C2440A是32位处理器,理论上拥有32根地址线,寻址空间0x00000000~0xFFFFFFFF,即4G 而实际上,S3C2440A只拥有27根地址线,实际物理寻址空间为0x...
  • elitah
  • elitah
  • 2013年11月27日 14:37
  • 1253

WinCE上BINFS实现详解

本文转自 http://www.cnblogs.com/wenziqi/archive/2010/08/23/1806199.html WinCE上BINFS实现详解 网上...
  • w0801101117
  • w0801101117
  • 2013年06月07日 11:01
  • 477

WinCE上BINFS实现详解

转载请注明原帖地址及出自ARMCE,此为ARMCE定制原创稿 作者: wwfiney@ARMCE 网上不少介绍三星24x0系列的BINFS启动方式实现,有些内容上描述的不是非常全面 下面就W...
  • ADC0809608
  • ADC0809608
  • 2014年02月04日 00:25
  • 875

WinCE上BINFS实现详解

网上不少介绍三星24x0系列的BINFS启动方式实现,有些内容上描述的不是非常全面 下面就WinCE6上的BINFS实现,从基本原理到修改BSP,再到如何烧录启动做一个较全面的讲解 一 BIN...
  • n567656756765676567
  • n567656756765676567
  • 2013年07月26日 16:50
  • 4663

hadoop生态系统学习之路(六)hive的简单使用

一、hive的基本概念与原理Hive是基于Hadoop之上的数据仓库,可以存储、查询和分析存储在 Hadoop 中的大规模数据。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 S...
  • qiyongkang520
  • qiyongkang520
  • 2016年04月05日 13:02
  • 3746

WinCE上BINFS实现详解

WinCE上BINFS实现详解 网上不少介绍三星24x0系列的BINFS启动方式实现,有些内容上描述的不是非常全面。 下面就WinCE6上的BINFS实现,从基本原理到修改BSP ,再到如何烧录启动做...
  • wuyusheng314
  • wuyusheng314
  • 2017年02月18日 14:53
  • 67

WinCE上BINFS实现详解

网上不少介绍三星24x0系列的BINFS启动方式实现,有些内容上描述的不是非常全面 下面就WinCE6上的BINFS实现,从基本原理到修改BSP,再到如何烧录启动做一个较全面的讲解 一 BINFS...
  • LoongEmbedded
  • LoongEmbedded
  • 2015年02月05日 22:10
  • 752

WinCE上BINFS实现详解

作者: wwfiney@ARMCE 网上不少介绍三星24x0系列的BINFS启动方式实现,有些内容上描述的不是非常全面 下面就WinCE6上的BINFS实现,从基本原理到修改BSP,再到如何烧录启动做...
  • wuyusheng314
  • wuyusheng314
  • 2017年02月18日 14:53
  • 207

【ARM学习笔记】一、S3C2440A官方简介

S3C2440A 是三星公司推出的16/32位精简指令集(RISC)微型处理器,它基于ARM v9系列的ARM920T核心,主要为手持设备和普通应用提供了低功耗的高性能的小型芯片微型控制器的解决方案。...
  • elitah
  • elitah
  • 2013年11月27日 10:42
  • 2197

S3C2440芯片手册翻译_1

最近我看的是S3C2440的芯片手册,经过浏览后,对ARM处理器的理解更深入一层了。   首先,芯片手册介绍了ARM指令集,THUMB指令集,内存控制器,NAND FLASH控制器,时钟和电源管理器...
  • u012571715
  • u012571715
  • 2015年11月01日 10:09
  • 398
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:S3c2440A平台HIVE注册表+binfs的实现
举报原因:
原因补充:

(最多只允许输入30个字)