Windows CE 进程、线程和内存管理(三)
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帮助。 |