主要利用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?


GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐