WinCE下申请大容量物理内存

原创 2004年10月29日 14:43:00

reference from:http://www.chinabyte.com/SoftChannel/72342371878043648/20040909/1852224.shtml

[文章信息]
 
作者: 付林林
时间: 2004-09-09
出处: 天极网
责任编辑: 方舟
 
[文章导读]
 
申请大容量的物理内存看起来不是难事,这里的大容量是指几十MB甚至更多的物理内存


[正文]   
 
  申请大容量的物理内存看起来不是难事。这里的大容量是指几十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)
{
///创建文件映射对象失败
return;
}
LPVOID lpAddress;
lpAddress = MapViewOfFile(hFile, FILE_MAP_WRITE|FILE_MAP_READ, 0, 0, MAXLEN);
if(lpAddress == NULL)
{
///创建文件视图失败
return;
}

  上述的函数如果都成功了,你就可以使用物理内存了。虚拟内存的首地址是lpAddress。使用完了别忘了调用函数UnmapViewOfFile(lpAddress); 和CloseHandle(hFile);

WinCE下申请大容量物理内存

作者:付林林   来源:天极网      申请大容量的物理内存看起来不是难事。这里的大容量是指几十MB甚至更多的物理内存。对于C++程序员来说可能平时习惯了使用“new”操作符来实现。我也是这样。使用...
  • mobilechannel
  • mobilechannel
  • 2005年01月30日 21:18
  • 804

WinCE申请大容量物理内存

申请大容量的物理内存看起来不是难事。这里的大容量是指几十MB甚至更多的物理内存。对于C++程序员来说可能平时习惯了使用"new"操作符来实现。我也是这样。使用"new"非常简单,申请之后只需判断返回的...
  • bigapple88
  • bigapple88
  • 2010年06月30日 11:13
  • 742

在Windows CE 下申请大容量物理内存

申请大容量的物理内存看起来不是难事。这里的大容量是指几十MB甚至更多的物理内存。对于C++程序员来说可能平时习惯了使用"new"操作符来实现。我也是这样。使用"new"非常简单,申请之后只需判断返回的...
  • yuedingy
  • yuedingy
  • 2008年12月25日 10:06
  • 300

linux驱动中分配连续物理内存

dma_alloc_coherent vs dma_alloc_writecombine 都是分配连续物理内存,返回虚拟地址 1.dma_alloc_coherent #define pgprot_n...
  • liukun321
  • liukun321
  • 2014年10月14日 21:48
  • 6043

WinCE下内存申请API比较

HeapAlloc,GlobalAlloc,LocalAlloc,VirtualAlloc,Malloc,New的比较 1. 首先我们来看HeapAlloc: MSDN上的解释 为:HeapALl...
  • michaelcao1980
  • michaelcao1980
  • 2013年01月25日 10:07
  • 1254

WinCE支持大容量(4G及以上)SD卡的解决办法

1.       要确保至少更新了07年全年的更新包。 2.       在platform->setting->environment 中设置环境变量IMGSDBUS2 = 1 ,为什么要这样设置...
  • jwc2436
  • jwc2436
  • 2014年05月27日 14:46
  • 1098

WINCE补丁包下载地址

http://msdn.microsoft.com/en-us/windowsembedded/dn205267
  • LoongEmbedded
  • LoongEmbedded
  • 2013年08月25日 18:34
  • 1942

分配连续物理内存的原因

在分配内存时,系统会尽量给我们分配连续的物理内存,这样有什么好处呢?我知道的有如下2条: 1、DMA不使用页表机制,因此必须分配连续的物理内存。 2、使用连续物理内存可以提高系统整体性能。 ...
  • wangpeihuixyz
  • wangpeihuixyz
  • 2014年05月29日 20:29
  • 1317

【原】mmap方法实现物理内存…

原文地址:【原】mmap方法实现物理内存到用户虚拟地址的映射作者:季义钦 内核空间内存管理: 物理内存被划分成struct page来进行管理。然后把所有page划分成不同的struct zone,L...
  • guo8113
  • guo8113
  • 2014年06月07日 17:41
  • 1431

linux 物理内存读写

#include #include #include #include #include #include main() {     int   i, j;     ...
  • hack8
  • hack8
  • 2014年01月19日 22:26
  • 1607
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WinCE下申请大容量物理内存
举报原因:
原因补充:

(最多只允许输入30个字)