Board logo

标题: WinCE线程和内存管理之内存管理 (6) [打印本页]

作者: yuyang911220    时间: 2014-7-28 08:41     标题: WinCE线程和内存管理之内存管理 (6)

HANDLE hMap;
hMap = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
1000,
L"abc");
if (hMap == NULL || GetLastError() != ERROR_ALREADY_EXISTS)
{
 MessageBox(L"create file mapping fail");
 return;
}


  6、分配大的虚拟地址空间

  可以用内存映射文件来分配大的虚拟地址空间。也可以直接调用VirtualAlloc函数来分配。VirtualAlloc函数是最底层的分配虚拟地址空间的函数。它会在调用进程内分配符合条件的地址空间并且自动用0初始化提交的存储器。传递一个你希望的虚拟地址空间的首地址给参数1(如果为0,那么内核自动查找一个符合条件的空间),参数2为大小(单位:字节),参数3为分配类型(提交还是保留),参数4为保护标志(只读、读写、执行等)。函数返回分配的地址空间的首地址。在进程地址空间中每个分配的块有三种状态:可用、保留、提交。参数3就是指明块的状态。我在做实验时发现,给参数1传递非0值均不成功,即使传递0给参数1让内核自动查找,得到的返回值再次用于参数1也不成功。释放这个虚拟地址空间调用VirtualFree函数。VirtualFree函数参数1指定首地址,参数2指定大小,参数3指定释放类型(撤销提交、释放)。函数成功返回真,失败返回假。参数3有两个标志,并且不能复合。当指定撤销提交标志(MEM_DECOMMIT)时,函数将取消这个虚拟地址空间的物理内存的映射,但是保留这块虚拟地址空间。如果这个虚拟地址空间没有提交函数也不会失败返回。当指定释放标志(MEM_RELEASE)时,如果这块虚拟地址空间含有同样的标志(保留或者提交)。函数将释放这块虚拟地址空间。如果这个虚拟地址空间有一部分提交了,其它部分没有提交,那么必须先调用此函数,并传递撤销提交标志,先将提交的这部分取消物理内存映射。然后再次调用此函数,传递释放标志。这样整个虚拟地址空间就都能够释放了。关于虚拟地址空间还有其它函数,比如VirtualQuery、VirtualProtect。在这里就不介绍了,请参见Windows CE.NET帮助。

  作者注:

  《进程、线程和内存管理》讲解的内容是我根据以前在PC机Windows操作系统中掌握的相关知识,又查看了Windows CE.NET的帮助文档和MSDN中Technical Articles和knowledge Base而得出的结论。遗憾的是Windows CE.NET的帮助文档介绍的太简单,我只能把掌握的知识和查看到的知识相结合,另外我还做了一些实验。我感谢浏览此文章的各位Windows CE下开发者,如果你们认为有哪些地方说的不正确的,希望指出来让我改正错误。让更多的人看到的是准确无误的文章。

  付林林:毕业时间:2001年,专业:计算机。从毕业起一直从事软件开发工作。目前从事 Windows CE 下操作系统内核定制和应用程序开发。在两年的时间里积累了CE下开发的一点点经验。希望和 CE 下开发者交流、探讨,更希望你们能不吝赐教。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0