C++ porting VirtualFree in OS X

C++ porting VirtualFree in OS X

本文关键字:OS in VirtualFree porting C++      更新时间:2023-10-16

我正在尝试建立我们的内存管理端口,其中某些分配器使用虚拟内存机制保留地址空间,而无需(开头)分配任何物理内存,然后仅分配内存当他们需要的时候。

该代码基于Windows的VirtualAlloc和VirtualFree,以使这些事情正常工作,现在我试图将此代码移植到Apple OS X,据我所知,一段时间后,它没有这样的API我想出以下代码:

//to reserve virtual address space 
//equivalent of VirtualAlloc(NULL, size, MEM_RESERVE, PAGE_NOACCESS)
void* ptr = mmap(NULL, size, PROT_NONE, (MAP_PRIVATE | MAP_ANON), -1, 0);
msync(ptr, size, (MS_SYNC | MS_INVALIDATE));
//to free ALL virtual address space 
//equivalent of VirtualFree(addr, 0, MEM_RELEASE)
//where "size" is the size of the entire virtual address space and "addr" the starting address
msync(addr, size, MS_SYNC); 
munmap(addr, size);
//to allocate physical memory
//equivalent of VirtualAlloc(addr, size, MEM_COMMIT, PAGE_READWRITE)
void* ptr = mmap(addr, size, (PROT_READ | PROT_WRITE), (MAP_FIXED | MAP_SHARED | MAP_ANON), -1, 0);
msync(addr, size, (MS_SYNC | MS_INVALIDATE));

我唯一不知道的是如何将使用VirtualFree移植到免费/不合格的物理内存的一部分,模仿VirtualFree Call:

VirtualFree(addr, size, MEM_DECOMMIT);

我试图用所需的地址和大小调用MUNMAP,但它不会释放内存...呼叫以释放所有虚拟空间时,我都可以完美地拨打内存。

有人可以帮助我完成此任务吗?

我找到了自己问题的答案,这要归功于此博客:http://blog.nervus.org/managing-virtual-address-paces-with-mmap/

我还在这里发布了他的解决方案,以防链接死亡:

void DecommitMemory(void* addr, size_t size)
{
    // instead of unmapping the address, we're just gonna trick 
    // the TLB to mark this as a new mapped area which, due to 
    // demand paging, will not be committed until used.
    mmap(addr, size, PROT_NONE, MAP_FIXED|MAP_PRIVATE|MAP_ANON, -1, 0);
    msync(addr, size, MS_SYNC|MS_INVALIDATE);
}