XIP与HIVE

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

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

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

最后总结一下:
1.新建一个工程,把该选的组件都选上。

2.添加HIVE支持。
 a. 在PB中加入"Hive-based Registry"、“FAT FILE SYSTEM”。
 b.打开platform.reg,完成如下信息:
  ;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   ;这个就是设置注册表每次改动后自动flush到system.hv
  ;"SystemHiveInitialSize"=dword:19000   ; Initial size for hive-registry file 
  ; END HIVE BOOT SECTION
  
  ;#####################################################################################################
  ; HIVE BOOT SECTION
  ; Add BinFS to partition table 
  [HKEY_LOCAL_MACHINE/System/StorageManager/PartitionTable] 
          "21"="BINFS" 
  
  [HKEY_LOCAL_MACHINE/System/StorageManager/BINFS] 
          "Folder"="BINFS" 
          "FriendlyName"="Bin FileSystem" 
          "Dll"="binfs.dll" 
          ; MountFlags: 
          ; 0x10 specifies that this file system is to be mounted as an external 
          ;      ROM filesystem shadowing the /windows directory 
          ; 0x1 specifies that the mountpoint /BINFS is to be hidden 
          ; 
          "MountFlags"=dword:10  
          "BootPhase"=dword:0 
  
  [HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/SMFlash]
   "DriverPath"="Drivers//BlockDevice//SMFlash"
   "LoadFlags"=dword:1
   "MountFlags"=dword:11
   "BootPhase"=dword:0
  
  [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
  
  ; 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  ;要在第一阶段加载binfs
      
  [HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NANDFLASH/BINFS]
      "MountHidden"=dword:1
      "MountAsROM"=dword:1
  
  [HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/SMFlash/Filters/CacheFilt]
      "Dll"="cachefilt.dll"
      "LockIOBuffers"=dword:1
  
  ; END HIVE BOOT SECTION
  
  ;#####################################################################################################
  ;1st fat area
  ; HIVE BOOT SECTION
  [HKEY_LOCAL_MACHINE/Drivers/BuiltIn/FlashDisk]
     "Prefix"="DSK"
     "Dll"="ONDisk.dll"
     "Order"=dword:1
  ;   "Index"=dword:1
     "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
     "Profile"="FlashDisk"
     "BmlVolumeId"=dword:0 ; BML volume ID = 0
     "BmlPartitionId"=dword:8 ; BML parition ID = PARTITION_ID_FILESYSTEM
     "WMRStartSector"=dword:0
     "WMRNumOfSector"=dword:40000 ; 128MByte
  ;   "Flags"=dword:11000 ; do not load again in boot phase 2 ;
  IF IMGHIVEREG
    "Flags"=dword:1000 ; do not load again in boot phase 2 ;
  ENDIF IMGHIVEREG
 
  [HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/FlashDisk]
      "DefaultFileSystem"="FATFS"
      "PartitionDriver"="mspart.dll"
      "Name"="PocketMory MLC Disk"
  ;    "Folder"="Sys"
      "AutoMount"=dword:1
      "AutoPart"=dword:1
      "AutoFormat"=dword:1
  ;    "MountFlags"=dword:0
  ;    "Ioctl"=dword:4
  IF IMGHIVEREG
    "MountAsBootable"=dword:1  ; for Hive-based registry,这个是wince 5.0下指定这个分区保存system.hv的关键

  ENDIF IMGHIVEREG
  
  [HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/FlashDisk]
      "DriverPath"="Drivers//BuiltIn//FlashDisk"
      ; LoadFlags 0x01 == load synchronously
      "LoadFlags"=dword:1
      "BootPhase"=dword:0
  
  [HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/FlashDisk/FATFS]
      "FriendlyName"="PocketMory FAT FileSystem"
  ;    "Dll"="fatfsd.dll"
      "Flags"=dword:00000014   ; FATFS_ENABLE_BACKUP_FAT | FATFS_DISABLE_AUTOSCAN
      "Folder"="Sys"
      "FormatExfat"=dword:1
  ;    "EnableCacheWarm"=dword:0
      "CheckForFormat"=dword:1
      "EnableWriteBack"=dword:1
      "EnableCacheWarm"=dword:0
  
  [HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/FlashDisk/Filters/CacheFilt]
     "Dll"="cachefilt.dll"
     "LockIOBuffers"=dword:1
 
  [HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/FlashDisk/FATFS/Filters/CacheFilt]
      "Dll"="cachefilt.dll"
      "LockIOBuffers"=dword:1
  ; END HIVE BOOT SECTION
;#####################################################################################################

3.打开SMDK6410/SMDK6410.bat,打开xip开关
  set IMGMULTIXIP=1
  
4.对FILES/config.bib进行修改
;下面这个layout可以随便改,以适应自己的系统。要注意layout的规律哦。
#define    CHAIN_ADDRESS    806C0000
#define    CHAIN_LENGTH     00004000
;-----------------------------------------------------
;   NAME        ADDRESS         SIZE            TYPE
;-----------------------------------------------------
    XIPKERNEL   80100000        005c0000        RAMIMAGE
    CHAIN       $(CHAIN_ADDRESS)    $(CHAIN_LENGTH)    RESERVED
   NK          80700000        03F00000        NANDIMAGE
    RAM         80700000        05600000        RAM
    FLASH       92000000  00100000  RESERVED  
 
5.对FILES/platform.bib进行修改
 把所有的NK都更改为$(XIPKERNEL),为了在xipkernel启动就把外围设备驱动load到内存,要不会造成外围设备用不了。

6.加入最小系统文件。要加入的文件有:
//必须的有
 "nk.exe",
 "coredll.dll",
 "filesys.dll",
 "exfat.dll",
 "diskcache.dll",
 "fatutil.dll",
 "binfs.dll",
 "fsdmgr.dll",
 "mspart.dll",
 "ceddk.dll",
 "cachefilt.dll",
 "kernel.dll",
 "k.coredll.dll",
 "fpcrt.dll",
 "k.fpcrt.dll",
 "romfsd.dll",
 "device.dll",
 "udevice.exe",
 "devmgr.dll",
 "kitl.dll",
 "pm.dll",
 "devmgr.dll",
 "wince.nls",
 "initobj.dat",
 "ONDisk.dll",
 "initdb.ini",
 "boot.hv",
 //推荐继续添加的
 "busenum.dll",
 "servicesEnum.dll",
 "servicesd.exe",
 "services.exe",
 "servicesStart.exe",
 "oalioctl.dll",

 添加方法有三种:
  1.编译一次工程,然后修改build下的common.bib,把对应的都改为XIPKERNEL,MAKE IMAGE.(注意:只能用make image)
  2.编译一次工程,然后修改build下的ce.bib,把对应的都改为XIPKERNEL,在VS2005中project->open realease...,运行
   romimage ce.bib(注意:只能这样用)
  3.把附件中的processbib.exe,preromimage.bat加入到FILES/下,build 该工程即可,编译一次后也可以直接make image.推荐这个方法,一劳永逸,而且不容易操作出错哦。
  
7.用eboot烧写xip.bin.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Silverlight]16进制颜色转ARGB及Color转Int32

16进制色字符串转ARGB做Web的都喜欢用16进制字符串标识颜色,比如“#F5F5F5”这类的,自然这个到了Silverlight/WPF中就要用ARGB表示:“#FFF5F5F5”(前两位标识Alpha,即透明度)。这在XAML中没有任何问题&…

【转】DICOM通信 - PDU数据包(1)

转自:DICOM通信 - PDU数据包(1)_翼遥君的博客-CSDN博客 DICOM上层协议为DIMSE提供透明的网络数据传输服务,即以上层协议规定的协议数据单元传送接收DIMSE的命令流与数据流。上层协议中制定了上层服务以及协议数据单元(Protocol Data Unit,PD…

windows mobile 编译(生成镜像)提速

windows mobile 编译镜像总是让人难以忍受的耗时,当然我们不能每次修改一点东西就build All一次。 下面是自己工作中积累的【不同情况下使用的编译命令】来加速生成镜像的过程,不排除有错的可能,欢迎指正。 对于修改,一般可以分…

ASP.NET MVC + ADO.NET EF 项目实战(二):设计过程与设计工具

工欲善其事,必先利其器。好的工具能够成倍提升工作效率。ASP.NET MVC和ADO.NET EF也是因为其工具出色而受到欢迎。例如: MVC所提供的View模板工具; MVC所提供的View切换、向导工具; ADO.NET EF提供的模型设计工具; ADO…

【转】DICOM通信 - PDU数据包(2)

转自:DICOM通信 - PDU数据包(2)_翼遥君的博客-CSDN博客 DICOM通信-PDU数据包(1)博客中主要分析了DICOM通信协议的连接协商请求和连接协商应答。 在7个PDU数据包中还有5个数据包,从结构上来看,他们比协议的协商过程要简单明了一些。 这篇博客…

Win CE下编译选项介绍

在WinCE中,在"Build OS”菜单中,我们会看到不同的编译选项: "Sysgen","Build and Sysgen"和"Build and Sysgen current BSP" Sysgen:不用多说,当你在"Catalog&quo…

“启动Word时提示出错,只能用安全模式才能打开”的解决方法

启动Word时提示出错,只能用安全模式才能打开,在这种模式下,一些功能将被禁用。而且,每次启动都会出现这样的提示信息,同事们很多向我求助。提示窗口如下: 于是我采取了以下一些措施: 1、用Offic…

DotNET内存管理与垃圾回收[转]

1. Stack(栈)和Heap(堆)每个线程对应一个stack,线程创建的时候CLR为其创建这个stack,stack主要作用是记录函数的执行情况。值类型变量(函数的参数、局部变量等非成员变量)都分配在st…

WinCE中,环境变量的添加,删除和查询

在WinCE中有很多的环境变量,那么如何设置/删除/查询这些环境变量呢:1. 查询环境变量:当我们在PB里打开或者创建一个工程以后,我们可以在菜单中点 “build”->“Open Release Directory in Build Window”,然后会弹出…

【转】DICOM命令集和数据集解析!!

转自:DICOM命令集和数据集解析 - 微笑的艾米 - 博客园 摘 要:本文通过分析一个典型的DICOM消息,详细地解析了DICOM命令集和数据集的构成方式和其含义。并在此基础上,提出了一种实现DICOM命令集和数据集解析的实施方案&#xff0…

【转】WPF XAML X名称空间详解

转自:WPF XAML X名称空间详解_郎涯技术-CSDN博客 X名称空间里面的成员(如X:Name,X:Class)都是写给XAML编译器看的、用来引导XAML编译器将XAML代码编译为CLR代码。 【X名称空间里面到底都有些什么】 x名称空间映射的是:http://schemas.microsoft.com/winfx/2006/xam…

C++编绎器编绎C语言的问题

由于应用的需要,要在原来的C语言中加入C类,这时就会出现很多类型转换的错误,因为在C语言中默认的是强制转换的,而在C中不会自动强制转换,只能手工强制转化。所以出现错误了,只有一个错误一个错误的改了。我…

关于mult-xip bin的一些资料整理

一.实现multbin 1.首先修改config.bib 比如:#elif defined IMGMULTIBIN; NAME START ADDR SIZE TYPE; ----------------------------------------------------------------NK 80220000 007DE000 RAMIMAGE SHELL 809FE000 001…

x210-II WinCE启动10s,还可继续优化

为提高boot引导速度,,需支持multibin。方法如下: 1.D:\WINCE600\PLATFORM\SMDKV210\SMDKV210.bat REM For Multiple XIP (using demand paging on BINFS) set IMGMULTIXIP1 2.调整config.bib镜像大小 由于系统生成的XIPKERNEL约为3M。大于默认设置。所…

【转】DICOM医学图像处理:DICOM网络传输

背景: 专栏取名为DICOM医学图像处理原因是:博主是从医学图像处理算法研究时开始接触DICOM协议的。当初认识有局限性,认为DICOM只是一个简单的文件格式约定,简而言之,我当时认为DICOM协议就是扩展名为DCM文件的格式说明…

symbian c++ 开发环境Carbide.c++搭建

需要的东东:JDK1.3.1以上(自带了,不用安装),SDK 2.0 以上(CW版本),perl5.8.x carbide.c 免费版本 所以的东西都默认安装,下一步-->下一步,^_^! 现在开发用的最多的可能就是VC6了,听说以…

【转】9、XAML名称空间详解

转自&#xff1a;9、XAML名称空间详解 - 种花生的读书人 - 博客园 XAML命名空间 <Window xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"> </Window> xmlnshttp:…

ASP.NET中使用非托管DLL

在ASP.NET窗体页面中使用非托管的DLL&#xff0c;则该DLL的部署则成了一大麻烦事&#xff0c;你把他放在bin目录下不管用&#xff0c;网上介绍了几种解决办法&#xff0c;貌似有点繁琐&#xff0c;其实只要新建一个程序集项目来封装这个DLL中被调用的函数&#xff0c;然后在Web…

【转】Linux的.a、.so和.o文件

转自&#xff1a;Linux的.a、.so和.o文件_chlele0105的专栏-CSDN博客 在说明Linux的.a、.so和.o文件关系之前&#xff0c;先来看看windows下obj,lib,dll,exe的关系 windows下obj,lib,dll,exe的关系 lib是和dll对应的。lib是静态链接库的库文件&#xff0c;dll是动态链接库的库…

wince使用自定义字体

在wince中使用自定义字体其实很简单&#xff0c;只要将自已的字体加到你的程序中就可以使用了&#xff0c;在使用完后再将其清除掉。以wince中加使用"Georgia”字体为例&#xff1a; 在程序初始化的时候将你的字体加载进程序 AddFontResource(L"NandFlash\\Font\\Geo…