📄 24402memory.txt
字号:
目前我们的实验板可用RAM空间是64M,在WINCE系统中对应的虚拟地址从0x8c000000-0x8ff00000,我们来仔细分析一下这些宝贵的RAM资源是如何使用的。
首先,系统启动时会自动将映象NK.nb0拷贝到RAM中再运行,目前我们分配给NK.nb0的空间是29M(0x8c200000-0x8cdf0000)。无形当中就有29M不能使用,但是如果在定制系统的时候根据需求,以“开发出满足最大的开发需要的最小的系统内核”为标准,还是可以充分利用有限的RAM资源的。
其次,有一部分RAM可以由用户自己定义为某个外设的缓存区,比如:display、dbug、camera等等,这部分空间虽然可以修改,但是个人认为这部分空间没必要做修改。主要原因有二:一方面是这部分空间一般都是约定俗成的(比较了一个不同版本的BSP后得出来的),修改后有可能影响系统的稳定性;另一方面这部分空间是从0x8c000000-0x8c200000,大概就是2M空间,修改后可能可以省出1M空间。所以考虑到系统的稳定性,和节省的空间并不是很大,对这部分就不做修改。
配置系统内存和程序内存
在config.bib文件的config区有这样一个参数。
FSRAMPERCENT:
格式:FSRAMPERCENT = number
默认值为0x80808080。指定为文件系统分配的内存的百分比。number分为四个字节,由十六进制表示。
byte0的值(单位为4KB)表示在第一个2MB中,其中每1MB包含的4KB的整数倍。
byte1的值(单位为4KB)表示在第二个2MB中,其中每1MB包含的4KB的整数倍。
byte2的值(单位为4KB)表示在第三个2MB中,其中每1MB包含的4KB的整数倍。
byte3的值(单位为4KB)表示在剩下的内存中,每1MB包含的4KB的整数倍。
计算一下默认值0x80808080表示的百分比:0x80*4K/1M = 0.5,因为每个字节都等于0.5,所以整个占用的百分比是50%。
默认情况下,系统内存和文件内存是各占50%的,所以程序内存就只有17M了。为了提高系统的性能可以通过修改FSRAMPERCENT值的大小,来获得较大的程序内存空间。
又一篇
我的是2440的板子的BSP,里边的原文件我拿过来分析的,其中有几个地方不懂,请大家指教:
boot.bib文件
MEMORY
; Name Start Size Type
; ------- -------- -------- ----
DRV_GLB 8c020000 00001000 RESERVED
BIN_FS 8c021000 00005000 RESERVED
RAM 8c026000 00006000 RAM
STACK 8c02c000 00004000 RESERVED
EBOOT 8c038000 00020000 RAMIMAGE
; EBOOT 8c038000 00040000 RAMIMAGE
; 16 MB area used to cache nk.bin while programming boot media.
; TBD: we may need to adjust to 01400000 (20 MB) to cache PPC 2003.
FLSCACHE 8D000000 01000000 RESERVED
config.bib文件:
;#define CHAIN_ADDRESS 81E40000
; CHAIN $(CHAIN_ADDRESS) 00001000 RESERVED
; pdwXIPLoc 00000000 $(CHAIN_ADDRESS) FIXUPVAR
;;; Tarzan Debug mode
NK 8C200000 02400000 RAMIMAGE
RAM 8E600000 01900000 RAM
; Common RAM areas
AUD_DMA 8c002000 00002000 RESERVED
DRV_GLB 8c010000 00010000 RESERVED
SD_DMA 8c028000 00008000 RESERVED
EDBG 8c030000 00020000 RESERVED
DISPLAY 8c1d0000 00030000 RESERVED
现在不明白的地方有:
(1)boot.bib中和config.bib定义的内存段有重复的地方,比如说EBOOT 8c038000 00020000 RAMIMAGE 和
EDBG 8c030000 00020000 RESERVED 这样是否有影响,我看到有文章说,EBOOT镜像在的地方不可以被重写和覆盖,但是,这里却重复了???
(2)按理说,congfig.bib中的定义和头文件中定义的地址一致才对,以下是我从loarder.h中截出来的,请看
// Nk Memory reigions defined in config.bib...
//
#define ROM_RAMIMAGE_START 0x8C100000
#define ROM_RAMIMAGE_SIZE 0x01000000
// Start addresses must match config.bib's RAMIMAGE
#define RAM_START 0x8d100000
#define RAM_SIZE 0x00F00000
按照config.bib的定义,以上应该是以下才对
// Nk Memory reigions defined in config.bib...
//
#define ROM_RAMIMAGE_START 8C200000
#define ROM_RAMIMAGE_SIZE 02400000
// Start addresses must match config.bib's RAMIMAGE
#define RAM_START 8E600000
#define RAM_SIZE 01900000
这个是我的理解错误,还是什么的,请各位大侠指教,我的是wince5.0
又一篇
实现永久保存注册表数据
关于注册表在前面的文章中已经介绍过了,这里只讲述如何实现永久保存注册表数据。
注册表类型分为基于对象存储的注册表和基于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_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。
3、如果是多用户,可以在上述的注册表位置下输入"DefaultUser"="<username>",指定默认的用户名。如果是单用户系统,可以不设置。
4、保证将包含系统HIVE的文件系统驱动程序的注册表信息和存储设备的驱动程序的注册表信息被包含在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之间,在这两个语句之间的注册表数据全部属于引导HIVE。假如我们将系统HIVE文件system.hv存放在硬盘上,并采用FAT文件系统。那么就要将[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]和[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]移动到“; HIVE BOOT SECTION”下。
5、在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之间的所有驱动程序的注册表信息中都加入下列一个标志:
"Flags"=dword:1000
这个标志是一个位掩码,它可以和其它已经存在的"Flags"或运算。值1000表示此驱动程序只加载一次,这样device.exe就不会把当前驱动程序加载两次了。
6、在包含系统HIVE的存储设备的驱动程序的注册表信息中,加入如下标志(假设是硬盘):
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]
"MountFlags"=dword:2
这个标志表示这个存储设备包含系统HIVE文件。
按照如上所述设置后的内核就能实现永久存储注册表数据了。对于保存注册表数据的执行动作在此必须阐述清楚:
正常情况下,CE能够保证重要的注册表数据能够从内存刷到(Flush)永久存储器上。但是这并不能完全保证所有数据都能完整地保存而不丢失,所以要保证万无一失,应该主动地调用RegFlushKey函数强制将内存中的数据刷到永久存储器上。这个函数的参数只有一个,就是注册表分支。CE还增加一个注册表项(如下所示),它的作用是每当函数RegCloseKey被调用时都自动调用RegFlushKey函数。
[HKEY_LOCAL_MACHINE\init\BootVars]
"RegistryFlags"=dword:1
如果CE在启动过程中发现系统HIVE出现错误,它会自动删除文件并创建一个默认的系统HIVE文件,如果出现下面的注册表项,说明发生了这种事情。
[HKEY_LOCAL_MACHINE]
"RegPersisted"=dword:1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -