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

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

  先来回味一下底层的东东,我们的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的建立工作是在用UT(OEM自己的一种底层的工具集)实现的,UT在烧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牵到一起搞得很多问题都走错了方向,本来一天就能搞定结果搞了四五天,NND。这么说吧,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)在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
"Flags"=dword:3  ; 这个应该是wince 5.0下决定在哪个阶段启动device.exe的表项
"DefaultUser"="default"       ;咱们只有一个用户default,基本上就是决定user.hv的路径了

"RegistryFlags"=dword:1   ;这个就是设置注册表每次改动后自动flush到system.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"  ;这个binfs的驱动DLL一定要在XIPKERNEL内部
"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"   ;这个分区的驱动DLL一定要在XIPKERNEL内部
"AutoMount"=dword:1
"AutoPart"=dword:1
"MountFlags"=dword:11
"Folder"="ResidentFlash"
"Name"="Samsung Flash Disk"
"BootPhase"=dword:0  ;要在第一阶段加载binfs
"Flags"=dword:1000
"MountHidden"=dword:0   ;有了这个你就可以在/BINFS目录下看到所有的NK.bin的东东了

;###########################################################################

;###########################################################################
;这个部分是设置保存system.hv的磁盘的驱动程序,每个人不一样了,但是大同小异
;我这里用的是PoketStroeII15的Flash驱动,system.hv保存在第一个Flash分区上
IF BSP_POCKETSTORE
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\PocketStore]
  "Prefix"="DSK"
  "Dll"="ONDisk.dll"   ;这个是在binfs之后加载,所以可以放在NK.bin中
  "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
;###########################################################################

;END HIVE BOOT SECTION



补充:
  我的Flash划分了四个区,第一个区是放4k的只能以nor模式运行的bootloader,然后第二个区放置UT,第三个区放置XIPKERNEL和BINFS,第四个区是将剩下的所有的扇区格式化为一个FAT分区作为文件系统,system.hv就是放置在最后一个分区中,在wince起来之后可以看到有个document and setting文件夹,里面的hv文件都是隐藏的。


  我们用的是三星的ONENAND的flash,其实就是拥有4K NOR的NAND flash,我们的bootloader也分成三部份,第一部分bootloader主要是映射到0x00000000地址的一些跳转指令,这个部分会被烧写到flash的前4K里面,然后三星的ONENAND会自动复制前4K的数据到一个类似NOR的物理模块中,这个NOR模块支持CPU的直接寻址;第二部份叫IPL,它的功能是加载在NAND flash中的image或UT,然后在加载后跳转到其RAM中的入口去执行,因为CPU的数据线和地址线在这个时候还只能直接访问NOR flash,要访问NAND flash的话必须要有NAND的接口驱动,所以在IPL的部分会有NAND的接口驱动的代码,这就导致IPL的代码一般有几十到上百K,我们的flash一个块是128K,前两部分一共占了两个块;第三个部分是UT,就是一些通用的工具,比如烧image,烧bootloader,格式化flash等常用的维护和image升级工具,这个部分的数据最多包括了很多的驱动程序,体积也很大,有300K的样子。

  最后我们的三个部分的bootloader一共占据了flash的头10个块(block),128K*10,但这三个部分在三星的flash的分区中是两个BML分区(三星的flash驱动PocetStoreII里面的概念,你就把它看成普通的磁盘分区好了),等下后面给的图示可以看到。

  接下来的块会放置一个MBR,然后从11个块开始我们放置wince的image了,这个区是第三个BML分区,大小一般在40-200个块左右,因为wince的image也就在4M-20M左右,这些划分分区的工作都是由上面提到的UT去做的,我也没有仔细看源代码,只是看到有BMLFormat之类的函数,其参数就是后面看到的图示。如果是binfs那么这个区会放置两个模块:XIPKERNEL和NK,NK的区域会被binfs的驱动识别并且加载成FAT分区的样子,可以在wince的资源管理器中看到的,具体是怎么被识别的还没有认真的搞懂。

  大概算下来,前面所有的空间也就被占用20多M的样子,剩下的空间了你可以随意利用了,分区的方法还是调用三星的flash驱动中的BMLFormat和STLformat,分区的参数定好了它们就会自动把分区建好,这部分的工作我们在BT中完成的。然后WinCE中仅仅需要将这些分区读出来并显示成磁盘就行了,这个就和SD、HDD的驱动相似了,参考上面的介于“IF BSP_POCKETSTORE”部分的注册表写法就行了。

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

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

相关文章

DHT

DHT 类似Tracker的根据种子特征码返回种子信息的网络.DHT全称叫分布式哈希表(Distributed Hash Table),是一种分布式存储方法。在不需要服务器的情况下,每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整个DHT网…

【转】日志记录库(log4cxx)使用指南

转自:日志记录库(log4cxx)使用指南_外环西路-CSDN博客 一、Log4j、log4cxx简介 Log4j、log4cxx有三个主要的组件: Loggers(记录器),Appenders (输出源)和Layouts(布局)。Loggers(记录器): 负责执行记录日…

WinCE5.0 SMDK2410 BSP在GEC2410开发板上的移植(11)-BINFS在Nand上的实现(Multi-Bin的实现)

之前我们都是把整个系统镜像复制到RAM中运行,这样启动时间较慢,也占用内存.使用Multi-Bin的模式,将需要复制到RAM的组件和可存放在存储设备(如Nand)中的组件分开,系统启动时只需要将CE核心组件复制到内存中运行,然后需要的组件从Nand中读取即可.之前我们已经在eboot中添加了操作…

C# 数据库连接字符串集合

c#数据库连接字符串集合(一)常用连接:1.使用SqlConnection对象: a. Sql 验证public void SqlConnectionOpen(){SqlConnection conn new SqlConnection();conn.ConnectionString "user idsa;password;initial catalognorthwind;datasourcelocalhost;connect Timeout20&quo…

【转】聊聊Linux操作系统中的显示管理器及如何更换

转自:聊聊Linux操作系统中的显示管理器及如何更换 - linux-123 - 博客园 聊聊Linux操作系统中的显示管理器及如何更换 | 《Linux就该这么学》 什么是 Linux 中的显示管理器? 简单来说,显示管理器display manager(DM&#xff09…

winCE改变字库方法(WINCE字库更新)

更新系统字库:例如要在WinCE5.0加入微软雅黑字体的支持。 第一步:增加如下注册表 [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/FontPath] "FontPath""// Windows " ; 字库文件所在目录 [HKEY_LOCAL_MACHINE/SYSTEM/GDI] "Fon…

【转】[WSL2]WSL2迁移虚拟磁盘文件ext4.vhdx

转自&#xff1a;[WSL2]WSL2迁移虚拟磁盘文件ext4.vhdx_Ryan ZHENG的专栏-CSDN博客 WSL2本质上是一个虚拟机&#xff0c;因此必然存在磁盘镜像文件。 默认情况下&#xff0c;这个镜像文件会放在C盘&#xff08;参考官网举例&#xff1a;%LOCALAPPDATA%\Packages<PackageFa…

WINCE字体动态加载

1. 加载字体 if (NULL ! AddFontResource(SDBOOTDisk\\FZY3JW.ttf)) ::SendMessage( HWND_BROADCAST, WM_FONTCHANGE, 0, 0); else AfxMessageBox(L"加载方正准圆简体字体失败!"); 2.创建字体并设置控件字体 CFont hFontNew&#xff1b; LOGFONT lf; …

ckedit 3.0 配置(一)

个人喜欢使用config.js的方式来使用&#xff0c;下面以此为例&#xff0c;介绍其配置参数。&#xff08;所示为默认值&#xff09;//当提交包含有此编辑器的表单时&#xff0c;是否自动更新元素内的数据config.autoUpdateElement true //编辑器的z-index值 config.baseFloatZI…

【转】Ubuntu中SVN客户端安装+使用

转自&#xff1a;Ubuntu中SVN客户端安装使用_三少GG-CSDN博客 1、 安装 svn客户端&#xff1a; apt-get install subversion&#xff0c;然后根据提示一步一步&#xff0c;就完成了 svn的安装。当然&#xff0c;也可以源码安装 svn&#xff0c;下载 subversion 一个最新版本的源…

x210烧写流程(inand)

今天拿到了x210的开发板&#xff0c;按照手册里的流程无法烧写。后资讯了客服后&#xff0c;才知道我的x210板子是inand的。而手册上讲的是nandflash板子的烧写流程。 以防忘记&#xff0c;把板子的烧写流程记录在此。 1. 拨码开关(OM0 - OM5)调成101101(irom)方式。 2. 打开DN…

【转】Linux命令行下svn ignore忽略文件或文件夹用法

转自&#xff1a;Linux命令行下svn ignore忽略文件或文件夹用法 - 陌上归人的博客 - 博客园 一、忽略单个目录 1、忽略文件夹 假如目录oa.youxi.com是从svn checkout出来的&#xff0c;在服务器本地目录添加了material&#xff0c;但是不希望把material加入版本控制&#xf…

避免Eclipse经常出现Out Of Memory

修改eclipse.ini -showsplash org.eclipse.platform --launcher.XXMaxPermSize 512m -vmargs -Xms256m -Xmx512m -XX:PermSize128M -XX:MaxPermSize128M Eclipse jee galileo DownLoad转载于:https://www.cnblogs.com/sun-li/archive/2010/01/18/1650900.html

PB编译错误:Mismatched time stamp on .rel file for module nk.exe requesting kernel fixup. Valid .rel file

如题&#xff0c;PB编译完后make时出现如下错误&#xff1a; Mismatched time stamp on .rel file for module nk.exe requesting kernel fixup. Valid .rel file is required for kernel fixups. 先Copy一下&#xff0c;再Make即可。 总结&#xff1a;很多情况下&#xff0c;…

【转】CT图像重构方法详解——傅里叶逆变换法、直接反投影法、滤波反投影法

转自&#xff1a;​​​​​​CT图像重构方法详解——傅里叶逆变换法、直接反投影法、滤波反投影法_Absolute Zero-CSDN博客_反投影法 绪 在做CT图像处理的时候遇到很多问题&#xff0c;对于滤波反变换有许多细节存在疑问&#xff0c;经过多天查找资料和利用MATLAB程序一步步实…

JS 对象介绍

JavaScript is an Object Oriented Programming (OOP) language. JS是面向对象的编程语言&#xff08;面向对象&#xff09;。 An OOP language allows you to define your own objects and make your own variable types.OOP语言可以让你自定义对象和变量类型。 -------------…

DNW应用程序错误,DNW错误问题解决

三星的USB驱动一直不是很稳定&#xff0c;有时候调2450&#xff0c;6410的时候&#xff0c;经常会把桌面系统搞得蓝屏。严重的时候&#xff0c;DNW都无法打开&#xff0c;提示DNW应用程序错误。很多人被难在这里了&#xff0c;只能重装系统。其实并不用重装系统&#xff0c;只用…

【转】交织容积重建技术:基本原理与临床价值

转自&#xff1a;交织容积重建技术&#xff1a;基本原理与临床价值_湃客_澎湃新闻-The Paper 原创 赵喜同学 XI区 单击上方蓝色字体 XI 区 或长按识别下方二维码关注我 大家好&#xff0c;欢迎大家访问XI区&#xff01; 所有医学成像系统的目标是从测量数据中提取最大数量的诊…

Tahoma,Arial和宋体英文字体

几年前一直用简体中文版的Widnows XP&#xff0c;从来没有觉得字体怎么怎么样。偶然看见英文版Windows XP就发现菜单或者文件夹的字体很好看&#xff0c;没怎么研究就把我的中文版XP换成了英文版并沿用至今。后来很久才知道可以在Control Panel -> Display -> Appearance…

ASP.NET教程11

最普通与常用的记录删除。如何在Sql Server中写删除的存储过程&#xff0c;如何在asp.net调用删除的存储过程&#xff0c;以及在asp.net的删除事件处理。 文件格式&#xff1a;.wmv&#xff1b;大小&#xff1a;11,450KB&#xff1b;长度&#xff1a;00:14:49。 下载地址&#…