在使用mmap的Linux上分配地址零失败

问题描述

我正在为Linux编写一个静态程序加载器,正在读取ELF程序头并将这些段映射到内存。

我遇到了一个可执行文件,该可执行文件假定其第一段的虚拟地址为0。我的内存映射失败,在地址0上分配虚拟页时出错。

我想知道是否可以为用户空间分配地址0处的所有内存。

请参见以下示例代码

/*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

这是返回的内容

$./a.out
mmap result 0xffffffffffffffff (errno Operation not permitted)

我将很高兴获得任何见识。

谢谢 B

解决方法

如果拥有特权,Linux将只允许您mmap进入第0页。

gcc mmaptests.c && sudo ./a.out

应该会让您:

mmap result (nil) (errno Success)