使用 mmap 在 Linux 上分配地址零失败
allocating address zero on Linux with mmap fails
我正在为 Linux 编写静态程序加载器,我正在读取 ELF 程序头并将段映射到内存。
我遇到一个假定其第一个段的虚拟地址为 0 的可执行文件。我的内存映射失败,我在地址 0
.
分配虚拟页面时出错
我想知道是否可以在地址 0
处为用户分配所有内存-space。
查看示例代码:
/*mmaptests.c*/
#include <sys/mman.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
int main()
{
void* p = mmap(0, sysconf(_SC_PAGE_SIZE), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
printf("mmap result %p (errno %s)\n",p,strerror(errno));
return 0;
}
我编译它:
gcc mmaptests.c
就是这样 returns :
$./a.out
mmap result 0xffffffffffffffff (errno Operation not permitted)
我很乐意提供任何见解。
谢谢
B
如果有权限,Linux 只会让您 mmap
第 0 页。
gcc mmaptests.c && sudo ./a.out
应该让你:
mmap result (nil) (errno Success)
我正在为 Linux 编写静态程序加载器,我正在读取 ELF 程序头并将段映射到内存。
我遇到一个假定其第一个段的虚拟地址为 0 的可执行文件。我的内存映射失败,我在地址 0
.
我想知道是否可以在地址 0
处为用户分配所有内存-space。
查看示例代码:
/*mmaptests.c*/
#include <sys/mman.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
int main()
{
void* p = mmap(0, sysconf(_SC_PAGE_SIZE), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
printf("mmap result %p (errno %s)\n",p,strerror(errno));
return 0;
}
我编译它:
gcc mmaptests.c
就是这样 returns :
$./a.out
mmap result 0xffffffffffffffff (errno Operation not permitted)
我很乐意提供任何见解。
谢谢 B
Linux 只会让您 mmap
第 0 页。
gcc mmaptests.c && sudo ./a.out
应该让你:
mmap result (nil) (errno Success)