C++ porting VirtualFree in OS X
C++ porting VirtualFree in OS X
我正在尝试建立我们的内存管理端口,其中某些分配器使用虚拟内存机制保留地址空间,而无需(开头)分配任何物理内存,然后仅分配内存当他们需要的时候。
该代码基于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);
}
相关文章:
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- "ostream &os"有什么用?
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- libprotobuf 检查在 Mac OS 上执行程序时失败
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- C++读取用户输入而不按回车键(Mac OS X),与Turbo Pascal中的读取键相同
- 如何在 MAC OS c/c++ 中阻止 USB 存储设备
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- IF-nesting in c++
- TrackPopupMenu equivalent in OS X
- C++ porting VirtualFree in OS X
- 如何可靠地检测 Mac OS X、iOS、Linux、Windows in C 预处理器