分类: C/C++
2008-04-23 21:53:25
Platform Builder之旅(六)
作者:付林林
增加对大容量物理内存的支持和永久存储注册表是在定制内核工作中常遇到的问题。本篇文章将对这两个方面阐述相关的知识并指导读者如何在PB中实现。
对大容量物理内存的支持
在PC上增加物理内存是很方便的,插上内存条后只要自检程序识别,那么桌面操作系统就能够支持。而在基于CE的产品上就没那么简单了。如果物理内存大于64MB,就要在定制内核时做一些工作。
一旦内存管理单元(MMU)开始工作,CPU就不再直接访问物理内存了,对于运行在x86和ARM系列CPU上的CE内核来说,必须先确立物理内存地址同虚拟内存地址的映射关系。这种关系实际是在一个名为OEMAddressTable的表中定义的。这个表在前面的文章中已经提到过。CE提供了两种虚拟地址映射方法,分别为静态映射和动态映射,这个表属于静态映射方法。静态映射的虚拟地址空间只能由内核访问,而动态映射的地址空间可以由用户模式的应用程序访问。OEMAddressTable在文件%_WINCEROOT%\Public\Common\Oak\Csp\i486\Oal\OEMInit.asm中。在这个文件的最后有一段代码:
; RAM 0x80000000 -> 0x00000000, size 64M dd 80000000h, 0, 04000000h dd 0, 0, 0这段代码表示将虚拟地址80000000映射到物理地址0,大小为64MB。将04000000h改成实际的物理内存大小,然后保存。接着单击PB菜单"Build"-"Open Build Release Directory",在命令行中先用cd命令进入上述目录,如:
cd %_WINCEROOT%\Public\Common\Oak\Csp\i486\Oal然后键入下列命令:
build -c sysgen i486oalbuild命令根据配置文件内容编译整个目录,sysgen批处理将build 编译的文件i486oal.lib文件复制到CE的安装目录和内核工程目录下。我安装的BSP是基于x86的,所以相应目录为
; 64 MB of RAM (note: AUTOSIZE will adjust boundary) IF IMGRAM64 NK 80220000 009E0000 RAMIMAGE RAM 80C00000 03000000 RAM UMABUF 83C00000 00400000 RESERVED ENDIF假如要支持128MB,更改如下:
IF IMGRAM16 ! IF IMGRAM32 ! IF IMGRAM64 ! NK 80220000 009E0000 RAMIMAGE RAM 80C00000 07000000 RAM UMABUF 87C00000 00400000 RESERVED ENDIF ENDIF ENDIF在这里没有更改NK的大小,只是修改了RAM的大小。 在config.bib定义之后,还可以在OAL层通过变量或者函数更改物理内存的大小,适合设备可能出现增加或减小内存的情况。CE的帮助文档介绍了几种方法,这里只提一下CreateStaticMapping函数。CreateStaticMapping函数作为config.bib文件的补充,适合在用户模式的应用程序或驱动程序中调用,调用这个函数能够将指定首地址的物理内存块映射到虚拟地址空间,函数返回虚拟地址。虚拟地址范围在C400 0000 到 E000 0000之间,这是内核的地址空间,只能由内核访问。相比较VirtualCopy函数用于动态地将指定首地址的物理内存块映射到虚拟地址空间,这个虚拟地址空间一般为用户进程的地址空间,因为VirtualCopy函数被设计专用于驱动程序调用,它常被用于将一个物理内存块映射到不同的虚拟地址空间。
; HIVE BOOT SECTION [HKEY_LOCAL_MACHINE\init\BootVars] "SYSTEMHIVE"="Documents and Settings\\system.hv" "PROFILEDIR"="Documents and Settings" "Start DevMgr"=dword:0 IF BSP_ENABLE_FSREGHIVE "Start DevMgr"=dword:1 ENDIF ; END HIVE BOOT SECTION"SYSTEMHIVE"的值为系统HIVE文件的路径。"Start DevMgr"是一个布尔值,指示是否开始就执行设备管理器device.exe,按照CE帮助文档的说法,只有想把系统HIVE存储在对象存储中才在此设置为0,所以一般都要设置为1。
"Flags"=dword:1000这个标志是一个位掩码,它可以和其它已经存在的"Flags"或运算。值1000表示此驱动程序只加载一次,这样device.exe就不会把当前驱动程序加载两次了。
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile] "MountFlags"=dword:2这个标志表示这个存储设备包含系统HIVE文件。
[HKEY_LOCAL_MACHINE\init\BootVars] "RegistryFlags"=dword:1如果CE在启动过程中发现系统HIVE出现错误,它会自动删除文件并创建一个默认的系统HIVE文件,如果出现下面的注册表项,说明发生了这种事情。
[HKEY_LOCAL_MACHINE] "RegPersisted"=dword:1写作时间:2004-10-26