资料介绍
增加对大容量物理内存的支持和永久存储注册表是在定制内核工作中常遇到的问题。本篇文章将对这两个方面阐述相关的知识并指导读者如何在PB中实现。
对大容量物理内存的支持
在PC上增加物理内存是很方便的,插上内存条后只要自检程序识别,那么桌面操作系统就能够支持。而在基于CE的产品上就没那么简单了。如果物理内存大于64MB,就要在定制内核时做一些工作。
一旦内存管理单元(MMU)开始工作,CPU就不再直接访问物理内存了,对于运行在x86和ARM系列CPU上的CE内核来说,必须先确立物理内存地址同虚拟内存地址的映射关系。这种关系实际是在一个名为OEMAddressTable的表中定义的。这个表在前面的文章中已经提到过。CE提供了两种虚拟地址映射方法,分别为静态映射和动态映射,这个表属于静态映射方法。静态映射的虚拟地址空间只能由内核访问,而动态映射的地址空间可以由用户模式的应用程序访问。OEMAddressTable在文件%_WINCEROOT%PublicCommonOakCspi486OalOEMInit.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%PublicCommonOakCspi486Oal
然后键入下列命令:
build -c
sysgen i486oal
build命令根据配置文件内容编译整个目录,sysgen批处理将build 编译的文件i486oal.lib文件复制到CE的安装目录和内核工程目录下。我安装的BSP是基于x86的,所以相应目录为%_WINCEROOT%PUBLICCOMMONOAKLIBX86RETAIL和%_PROJECTROOT%cesysgenoaklibx86 etail两个目录。上一步做完之后,接着开始修改config.bib文件。在以前的文章中讲过在config.bib文件中定义内存区域。在config.bib中预设的配置没有超过64MB的,所以要自己手工添加。可根据原有的IMGRAM64配置更改,原有的IMGRAM64如下:
; 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的注册表,在定制内核的时候只能选择其中一种。从理论上讲这两种注册表都能够实现永久保存注册表数据,但是采用不同的类型会影响CE的启动顺序和启动速度,还会影响内存的使用量。我还是趋向于采用基于HIVE的注册表来实现永久保存注册表数据,这也是一个发展趋势。在讲解之前先简单描述如果CE采用基于HIVE的注册表,那么在启动时如何加载已经保存的注册表数据:
1、nk.exe执行,启动filesys.exe。
2、filesys.exe加载引导HIVE,此时引导HIVE位于nk.bin解压之后的文件中。
3、filesys.exe启动device.exe,之后处于等待状态,等待device.exe将包含系统HIVE的文件系统和存储设备的驱动程序加载完毕。而这个文件系统和存储设备的驱动程序存在于引导HIVE中。
4、device.exe加载上述所说的文件系统驱动程序和存储设备驱动程序,使之开始工作。之后device.exe处于等待状态。
5、filesys.exe被唤醒,加载并且安装系统HIVE。之后filesys.exe处于等待状态。
6、nk.exe按照系统HIVE的信息开始执行初始化工作。其中包括加载驱动程序和启动一些应用程序。其中加载驱动程序一般由device.exe执行,而启动应用程序由filesys.exe执行。这时device.exe和filesys.exe已经被唤醒。
因为引导HIVE和系统HIVE肯定有重复的地方,所以可能出现重复加载了驱动程序或者重复启动了应用程序。为此,CE允许在描述驱动程序的注册表信息中加入防止重复的标志,而应用程序可以采用事件对象来防止重复启动,如device.exe。
下面讲述如何设置基于HIVE的注册表(假如保存系统HIVE的是FAT文件系统):
1、在PB中加入“Hive-based Registry”,如果是Geode平台,再加入BSP_ENABLE_FSREGHIVE环境变量。
2、打开platform.reg,找到如下信息:
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINEinitBootVars]
“SYSTEMHIVE”=“Documents and Settingssystem.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。
3、如果是多用户,可以在上述的注册表位置下输入“DefaultUser”=“《username》”,指定默认的用户名。如果是单用户系统,可以不设置。
4、保证将包含系统HIVE的文件系统驱动程序的注册表信息和存储设备的驱动程序的注册表信息被包含在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之间,在这两个语句之间的注册表数据全部属于引导HIVE。假如我们将系统HIVE文件system.hv存放在硬盘上,并采用FAT文件系统。那么就要将[HKEY_LOCAL_MACHINESystemStorageManagerFATFS]和[HKEY_LOCAL_MACHINESystemStorageManagerProfilesHDProfile]移动到“; HIVE BOOT SECTION”下。
5、在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之间的所有驱动程序的注册表信息中都加入下列一个标志:
“Flags”=dword:1000
这个标志是一个位掩码,它可以和其它已经存在的“Flags”或运算。值1000表示此驱动程序只加载一次,这样device.exe就不会把当前驱动程序加载两次了。
6、在包含系统HIVE的存储设备的驱动程序的注册表信息中,加入如下标志(假设是硬盘):
[HKEY_LOCAL_MACHINESystemStorageManagerProfilesHDProfile]
“MountFlags”=dword:2
这个标志表示这个存储设备包含系统HIVE文件。
按照如上所述设置后的内核就能实现永久存储注册表数据了。对于保存注册表数据的执行动作在此必须阐述清楚:
正常情况下,CE能够保证重要的注册表数据能够从内存刷到(Flush)永久存储器上。但是这并不能完全保证所有数据都能完整地保存而不丢失,所以要保证万无一失,应该主动地调用RegFlushKey函数强制将内存中的数据刷到永久存储器上。这个函数的参数只有一个,就是注册表分支。CE还增加一个注册表项(如下所示),它的作用是每当函数RegCloseKey被调用时都自动调用RegFlushKey函数。
[HKEY_LOCAL_MACHINEinitBootVars]
“RegistryFlags”=dword:1
如果CE在启动过程中发现系统HIVE出现错误,它会自动删除文件并创建一个默认的系统HIVE文件,如果出现下面的注册表项,说明发生了这种事情。
[HKEY_LOCAL_MACHINE]
“RegPersisted”=dword:1
对大容量物理内存的支持
在PC上增加物理内存是很方便的,插上内存条后只要自检程序识别,那么桌面操作系统就能够支持。而在基于CE的产品上就没那么简单了。如果物理内存大于64MB,就要在定制内核时做一些工作。
一旦内存管理单元(MMU)开始工作,CPU就不再直接访问物理内存了,对于运行在x86和ARM系列CPU上的CE内核来说,必须先确立物理内存地址同虚拟内存地址的映射关系。这种关系实际是在一个名为OEMAddressTable的表中定义的。这个表在前面的文章中已经提到过。CE提供了两种虚拟地址映射方法,分别为静态映射和动态映射,这个表属于静态映射方法。静态映射的虚拟地址空间只能由内核访问,而动态映射的地址空间可以由用户模式的应用程序访问。OEMAddressTable在文件%_WINCEROOT%PublicCommonOakCspi486OalOEMInit.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%PublicCommonOakCspi486Oal
然后键入下列命令:
build -c
sysgen i486oal
build命令根据配置文件内容编译整个目录,sysgen批处理将build 编译的文件i486oal.lib文件复制到CE的安装目录和内核工程目录下。我安装的BSP是基于x86的,所以相应目录为%_WINCEROOT%PUBLICCOMMONOAKLIBX86RETAIL和%_PROJECTROOT%cesysgenoaklibx86 etail两个目录。上一步做完之后,接着开始修改config.bib文件。在以前的文章中讲过在config.bib文件中定义内存区域。在config.bib中预设的配置没有超过64MB的,所以要自己手工添加。可根据原有的IMGRAM64配置更改,原有的IMGRAM64如下:
; 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的注册表,在定制内核的时候只能选择其中一种。从理论上讲这两种注册表都能够实现永久保存注册表数据,但是采用不同的类型会影响CE的启动顺序和启动速度,还会影响内存的使用量。我还是趋向于采用基于HIVE的注册表来实现永久保存注册表数据,这也是一个发展趋势。在讲解之前先简单描述如果CE采用基于HIVE的注册表,那么在启动时如何加载已经保存的注册表数据:
1、nk.exe执行,启动filesys.exe。
2、filesys.exe加载引导HIVE,此时引导HIVE位于nk.bin解压之后的文件中。
3、filesys.exe启动device.exe,之后处于等待状态,等待device.exe将包含系统HIVE的文件系统和存储设备的驱动程序加载完毕。而这个文件系统和存储设备的驱动程序存在于引导HIVE中。
4、device.exe加载上述所说的文件系统驱动程序和存储设备驱动程序,使之开始工作。之后device.exe处于等待状态。
5、filesys.exe被唤醒,加载并且安装系统HIVE。之后filesys.exe处于等待状态。
6、nk.exe按照系统HIVE的信息开始执行初始化工作。其中包括加载驱动程序和启动一些应用程序。其中加载驱动程序一般由device.exe执行,而启动应用程序由filesys.exe执行。这时device.exe和filesys.exe已经被唤醒。
因为引导HIVE和系统HIVE肯定有重复的地方,所以可能出现重复加载了驱动程序或者重复启动了应用程序。为此,CE允许在描述驱动程序的注册表信息中加入防止重复的标志,而应用程序可以采用事件对象来防止重复启动,如device.exe。
下面讲述如何设置基于HIVE的注册表(假如保存系统HIVE的是FAT文件系统):
1、在PB中加入“Hive-based Registry”,如果是Geode平台,再加入BSP_ENABLE_FSREGHIVE环境变量。
2、打开platform.reg,找到如下信息:
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINEinitBootVars]
“SYSTEMHIVE”=“Documents and Settingssystem.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。
3、如果是多用户,可以在上述的注册表位置下输入“DefaultUser”=“《username》”,指定默认的用户名。如果是单用户系统,可以不设置。
4、保证将包含系统HIVE的文件系统驱动程序的注册表信息和存储设备的驱动程序的注册表信息被包含在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之间,在这两个语句之间的注册表数据全部属于引导HIVE。假如我们将系统HIVE文件system.hv存放在硬盘上,并采用FAT文件系统。那么就要将[HKEY_LOCAL_MACHINESystemStorageManagerFATFS]和[HKEY_LOCAL_MACHINESystemStorageManagerProfilesHDProfile]移动到“; HIVE BOOT SECTION”下。
5、在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之间的所有驱动程序的注册表信息中都加入下列一个标志:
“Flags”=dword:1000
这个标志是一个位掩码,它可以和其它已经存在的“Flags”或运算。值1000表示此驱动程序只加载一次,这样device.exe就不会把当前驱动程序加载两次了。
6、在包含系统HIVE的存储设备的驱动程序的注册表信息中,加入如下标志(假设是硬盘):
[HKEY_LOCAL_MACHINESystemStorageManagerProfilesHDProfile]
“MountFlags”=dword:2
这个标志表示这个存储设备包含系统HIVE文件。
按照如上所述设置后的内核就能实现永久存储注册表数据了。对于保存注册表数据的执行动作在此必须阐述清楚:
正常情况下,CE能够保证重要的注册表数据能够从内存刷到(Flush)永久存储器上。但是这并不能完全保证所有数据都能完整地保存而不丢失,所以要保证万无一失,应该主动地调用RegFlushKey函数强制将内存中的数据刷到永久存储器上。这个函数的参数只有一个,就是注册表分支。CE还增加一个注册表项(如下所示),它的作用是每当函数RegCloseKey被调用时都自动调用RegFlushKey函数。
[HKEY_LOCAL_MACHINEinitBootVars]
“RegistryFlags”=dword:1
如果CE在启动过程中发现系统HIVE出现错误,它会自动删除文件并创建一个默认的系统HIVE文件,如果出现下面的注册表项,说明发生了这种事情。
[HKEY_LOCAL_MACHINE]
“RegPersisted”=dword:1
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- 深入解析Linux下 Platform_device 及Platform_driver
- GitHub入门与实践 0次下载
- 科技论文摘要编写要点分析 0次下载
- 开关电源的PCB电磁兼容设计要点分析
- 555电路图要点分析及经典实例 132次下载
- 电动汽车电池的六大要点问题 10次下载
- 开关电源的PCB电磁兼容设计要点分析 39次下载
- 高速电路设计实践PDF电子教材免费下载 329次下载
- FPGA视频教程之SOPC builder的详细基础知识说明 8次下载
- ArcGIS WebApp Builder安装教程 0次下载
- Platform Builder集成开发环境研究 1次下载
- DSP Builder下载入口 116次下载
- DSP Builder设计深入 54次下载
- ARM嵌入式WINDOWS CE实践教程
- 基于C++ Builder与LabWindows/CVI平台
- 【GD32 MCU 入门教程】一、GD32 MCU 开发环境搭建(3)使用 Embedded Builder 开发 GD32 443次阅读
- SiC驱动电源设计要点(变压器部分) 1236次阅读
- 选择PLC系统的步骤和要点 574次阅读
- 海思Hi3566V100 SDIO硬件设计要点 2175次阅读
- 一文总结linux的platform驱动 783次阅读
- 什么是eNSP?华为网络仿真平台eNSP的使用方法 1.3w次阅读
- 字节跳动基于Iceberg的海量特征存储实践 849次阅读
- Lombok同时使用@Data和@Builder的一个必须要避开的巨坑 1822次阅读
- pytorch实现断电继续训练时需要注意的要点 1287次阅读
- USB硬件EMC设计要点分享 5565次阅读
- 变频器的故障分析和解决 实践检验、理论知识及维修水平 4089次阅读
- 高过载变压器结构设计要点及思路详解(农网配电) 3503次阅读
- 在智能制造实践过程中,数据就是燃料,分析就是引擎 3688次阅读
- 基于微小液体流量计选型的5大要点分析 3652次阅读
- SATA支持ATAPI的设计要点 1708次阅读
下载排行
本周
- 1TPS54202H降压转换器评估模块用户指南
- 1.02MB | 7次下载 | 免费
- 2华瑞昇CR215芯片数字万用表原理图
- 0.21 MB | 1次下载 | 3 积分
- 3SMD LED选型目录 灯珠手册
- 5.36 MB | 1次下载 | 免费
- 4Tiva C系列DK-TM4C129X入门指南
- 1.69MB | 1次下载 | 免费
- 5电涌保护器(SPD)的选择、安装以及装配
- 4.57 MB | 1次下载 | 免费
- 6时源芯微EMC前车灯案例
- 458.59 KB | 1次下载 | 免费
- 7bq25890、bq25892双级联充电器EVM(PWR692)用户指南
- 2.02MB | 1次下载 | 免费
- 8TPS54426降压转换器评估模块用户指南
- 847.7KB | 次下载 | 免费
本月
- 1ADI高性能电源管理解决方案
- 2.43 MB | 156次下载 | 免费
- 22024PMIC市场洞察
- 2.23 MB | 63次下载 | 免费
- 3开关电源设计原理手册
- 1.83 MB | 30次下载 | 免费
- 4智能门锁原理图
- 0.39 MB | 28次下载 | 免费
- 5OAH0428最新规格书(中文)
- 2.52 MB | 15次下载 | 7 积分
- 6ST7789V2单芯片控制器/驱动器英文手册
- 3.07 MB | 9次下载 | 1 积分
- 7LTH7充电电路和锂电池升压5V输出电路原理图
- 0.04 MB | 7次下载 | 免费
- 8TPS54202H降压转换器评估模块用户指南
- 1.02MB | 7次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935119次下载 | 10 积分
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420061次下载 | 10 积分
- 3Altium DXP2002下载入口
- 未知 | 233084次下载 | 10 积分
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191367次下载 | 10 积分
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183334次下载 | 10 积分
- 6labview8.5下载
- 未知 | 81581次下载 | 10 积分
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73807次下载 | 10 积分
- 8LabVIEW 8.6下载
- 未知 | 65987次下载 | 10 积分
评论
查看更多