Windows CE 进程、线程和内存管理(三)
时间:11-09
来源:嵌入式资讯网
点击:
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下开发者,如果你们认为有哪些地方说的不正确的,希望指出来让我改正错误。让更多的人看到的是准确无误的文章。
Top