【问题标题】:C++ porting VirtualFree in OS XC++ 在 OS X 中移植 VirtualFree
【发布时间】:2015-07-15 10:44:11
【问题描述】:

我正在尝试为我们的内存管理提供一个端口,其中一些分配器使用虚拟内存机制来保留地址空间,而不(在开始时)分配任何物理内存,然后仅在需要时才分配内存。

该代码基于 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 调用:

VirtualFree(addr, size, MEM_DECOMMIT);

我尝试使用所需的地址和大小调用 munmap,但它不会释放内存...同时调用它来释放所有虚拟空间效果很好。

有人可以帮我完成这项任务吗?

【问题讨论】:

  • 您要移植到 Linux 还是 OS X?请相应地更改标签。因为看起来MADV_REMOVE 符合您的需要,但它是特定于 Linux 的标志。
  • 我正在移植到 OS X,标签已更改 :)

标签: c++ macos memory memory-management virtual-memory


【解决方案1】:

感谢这个博客,我找到了自己问题的答案: http://blog.nervus.org/managing-virtual-address-spaces-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);
}

【讨论】:

  • 你有没有把这些移植到 linux 上?
猜你喜欢
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 2012-05-12
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多