在Linux中利用mmap模拟Windows的VirtualAlloc
linux-dash
A beautiful web dashboard for Linux
项目地址:https://gitcode.com/gh_mirrors/li/linux-dash
免费下载资源
·
主要利用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释放这段内存
// 下面表示,释放刚才预留的全部内存。
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);
参考:
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 年前
更多推荐
已为社区贡献6条内容
所有评论(0)