申请大容量的物理内存看起来不是难事。这里的大容量是指几十MB甚至更多的物理内存。对于C++程序员来说可能平时习惯了使用"new"操作符来实现。我也是这样。使用"new"非常简单,申请之后只需判断返回的指针是否是空即可。在其它的Windows操作系统上的确不需要在申请大容量物理内存上过多考虑。但是在Windows CE上就不同了。如果只用"new"就能搞定,那就太省事了。
不知道Windows CE下软件开发者是否遇到过这种情况,如果使用"new"申请超过30MB的物理内存,那么返回的一定是空(NULL),甚至程序会死锁无法响应。这其实不奇怪。在《Windows CE下进程、线程和内存管理》的系列文章中我早有所言,Windows CE下每个进程占有32MB的地址空间,虽然Slot 1槽存放所有的非XIP DLL,但是我们不可能占用Slot 1槽。32MB地址空间减去必要的代码段、静态数据段、默认堆和默认栈之后,所剩的地址空间少于32MB。即使程序什么都不做也无法满足超过30MB的地址空间的申请需求。所以返回为空非常正常。好在Windows CE下运行的大多数软件不需要那么多的物理内存。
感觉微软的技术不是支持到很远的将来,而是得过且过,只要满足目前的和不远的将来的需求就行。拿Platform Builder来说,IMGRAM64环境变量用于支持64MB物理内存。可是没有IMGRAM128或者IMGRAM256甚至IMGRAM512。可能是当时绝大多数基于Windows CE的产品都没有超过64MB物理内存。现在要支持超过64MB物理内存就必须做一些修改操作。再如现在说的用"new"分配物理内存,也只是限制在 32MB以内。如果想new多少就new多少,那多爽!
"new"不行是因为地址空间不够,那我们可以采用虚拟内存分配,然后提交物理内存这种办法。理论上是这样,但是实际上还是不行。举例如下: LPVOID g_Address1, g_Address2;
g_Address1 = VirtualAlloc(0, 32 * 1024 * 1024, MEM_RESERVE, PAGE_NOACCESS);
g_Address2 = VirtualAlloc(g_Address1, 32 * 1024 * 1024, MEM_COMMIT, PAGE_READWRITE);
上面这段代码中第一个语句是申请32MB的虚拟地址空间,函数返回一个地址说明申请是成功的。注意这个地址一定处于0x4200 0000以上(具体参见我的专栏中“Windows CE下进程、线程和内存管理(三)”)。第二个语句是提交物理内存,容量为32MB。这个函数返回NULL,说明申请物理内存不成功。如果申请10MB、 20MB的还可以。
希望再一次破灭。最后的办法就是内存映射文件了。在Windows CE的帮助文档中只提到了内存映射文件可以用来申请虚拟地址空间。可以试一试。结果证明用内存映射文件来申请大容量物理内存是可行的。内存映射文件用于多个进程共享数据时,创建内存映射的函数的第一个参数必须设置为INVALID_HANDLE_VALUE,表示在物理内存中创建。利用这个特点我们可以申请超过32MB的物理内存。具体能够申请的大小由剩余的物理内存决定。例子如下: #define MAXLEN (64*1024*1024)
HANDLE hFile;
hFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, MAXLEN, NULL);
if(hFile == NULL)
{
file://创建文件映射对象失败
return;
}
LPVOID lpAddress;
lpAddress = MapViewOfFile(hFile, FILE_MAP_WRITE|FILE_MAP_READ, 0, 0, MAXLEN);
if(lpAddress == NULL)
{
file://创建文件视图失败
return;
}
上述的函数如果都成功了,你就可以使用物理内存了。物理内存的首地址是lpAddress。使用完了别忘了调用函数UnmapViewOfFile(lpAddress); 和CloseHandle(hFile);
分享到:
相关推荐
### 大容量物理内存永久存储注册表 #### 增加大容量物理内存支持与永久存储注册表 在定制内核工作当中,增加对大容量物理内存的支持和实现注册表的永久存储是两个常见且重要的技术点。这两种技术的实现不仅能够...
WinCE内存管理系统采用了一个与Windows NT相似的模型,包括堆、栈和全局数据区等部分。堆是动态分配内存的主要区域,适用于大块内存的分配和释放。栈用于存储函数调用时的局部变量和函数参数。全局数据区则存放程序...
"wince 内存工具"是专为WinCE设计的一种实用工具,它允许用户直接读取和修改物理内存地址的内容,极大地简化了程序调试过程。通过这个工具,开发者可以更深入地理解系统内存的工作机制,定位并解决潜在的问题。 在...
1. **每个进程拥有大容量虚拟内存**:确保每个进程能够利用更丰富的虚拟地址空间,提高程序运行效率。 2. **无预设进程数限制**:虽然存在理论上的最大值,但实际限制更多由物理资源决定。 3. **进程间的保护**:...
本文档主要详细介绍WINCE6.0中操作系统内核对ARm及X86等硬件内存的管理和映射过程。
在Windows CE(简称WinCE)平台上,内存管理是系统优化和故障排查的重要环节。"wince 内存检测工具"是一种专门针对这个操作系统设计的工具,用于帮助开发者和系统管理员了解和诊断内存使用情况。这款工具包含了...
在Windows CE(简称WinCE)操作系统中,进程间的通信(IPC)是系统设计的重要组成部分,而共享内存是一种高效的数据交换机制。本篇文章将深入探讨WinCE中的进程共享内存及其相关知识点。 1. **共享内存的基本概念**...
在 WinCE 中,由于内存管理机制的原因,直接访问物理地址是不可行的。因此,我们需要将 GPIO 端口的物理地址映射到虚拟地址上。这一过程主要通过 `VirtualAlloc` 和 `VirtualCopy` 这两个函数来完成。 ##### ...
"WinCE内存监测工具"就是这样一个专门针对WinCE系统的实用程序,它能够帮助开发者实时监控内存状态,从而识别并解决可能存在的内存泄露问题。 内存泄露是编程中的一个常见错误,特别是在动态内存分配中。当应用程序...
WinCE内存监视工具是用来检测和分析系统内存使用情况的专业软件,尤其适用于WinCE 5.0版本。这款工具可以帮助开发者和系统管理员更好地理解和调整WinCE设备的内存性能,确保系统的稳定运行和高效利用资源。 内存...
首先,我们来看标题中的核心——“Wince内存和CPU使用率查看工具”。这个工具的主要功能就是实时监测Wince设备的内存分配情况和CPU负载,帮助开发者诊断系统性能问题。通过监控这些关键指标,可以及时发现内存泄漏、...
内存映射允许不同的进程将同一块物理内存视为自己的数据空间的一部分,从而实现数据的快速交换。在Wince6.0中,虽然OpenFileMapping函数可能不可用,但依然可以通过其他方式实现内存映射功能。 内存映射的基本原理...
该“wince内存清理工具”可能具有以下特点: 1. **定时清理**:用户可以设置定时任务,让工具在指定时间自动执行内存清理,无需手动操作,确保系统始终处于最佳状态。 2. **一键清理**:提供简单易用的一键清理功能...
由于32位寻址能力,WinCE的虚拟内存可以映射超过物理内存大小的地址空间,提供更大的可寻址范围。这一特性对于那些内存需求超出物理内存限制的嵌入式设备特别有用,因为它允许通过页面交换来模拟更大的内存,即使...
调用GlobalMemoryStatus函数可以获取一个MEMORYSTATUS结构体,其中包含了系统内存的当前状态,如总物理内存、可用物理内存、虚拟内存大小等信息。 4. **源码分析**: - `MEMORYSTATUS` 结构体:在源码中,首先会...
内存查看工具能显示系统总的内存容量、已分配内存、空闲内存以及各个进程的内存使用情况。这对于排查内存泄漏、分析内存碎片和优化内存分配策略十分有用。用户可以监控内存动态,发现异常增长的内存占用,及时采取...