在Linux中利用mmap模拟Windows的VirtualAlloc

来源:互联网 发布:奥运圣火 知乎 编辑:程序博客网 时间:2024/06/13 22:38
主要利用mmap中的匿名映射来实现。


VirtualAlloc的Linux实现如下:


// 预留内存(相当于Windows-VirtualAlloc的MEM_RESERVE)。
// 用mmap映射一块private、anonymous、non-accessible的内存。
// 下面表示从0x10000000开始,预留1GB的内存
void* result1 = mmap((void*)0x10000000, 0x40000000, PROT_NONE, MAP_PRIVATE | MAP_ANON, -1, 0);


// 占用内存(相当于Windows-VirtualAlloc的MEM_COMMIT)。
// 用mprotect来修改刚才预留的内存的权限。
// 下面表示,修改1MB内存的访问权限,使其可读可写。
int result2 = mprotect((void*)0x10000000, 0x100000, PROT_READ | PROT_WRITE);


// 取消占用(相当于Windows-VirtualFree的MEM_DECOMMIT)。
// 用mprotect来修改刚才预留的内存的权限。
// 下面表示,修改1MB内存的访问权限,使其不可访问,并且将这段内存清零。
int result3 = mprotect((void*)0x10000000, 0x100000, PROT_NONE);
memset((void*)0x10000000, 0, 0x100000);


// 释放内存(相当于Windows-VirtualFree的MEM_RELEASE)。
// 用munmap释放这段内存
// 下面表示,释放刚才预留的全部内存。

int result4 = munmap((void*)0x10000000, 0x40000000);


参考:

VirtualAlloc on Linux

How to allocate a region of memories which similar VirtualAlloc?


原创粉丝点击