mmap - 映射到 2^48 以上的地址

mmap - 映射到 2^48 以上的地址

我知道64位PC使用的地址空间是[0,2^48),但是我可以使用 mmap 将文件映射到 2 48以上的地址吗?

我写了下面的代码,但发现映射的地址仍在里面[0,2^48)

int
main(void) {
    const char* name = "/tmp/file";

    int fd = open(name, O_RDONLY);
    if (fd < 0) {
        perror("open");
        exit(-1);
    }

    int pageSize = sysconf(_SC_PAGE_SIZE);
    void* targetAddr = (void*)(0UL - pageSize);

    char* str = mmap(targetAddr, pageSize, PROT_READ, MAP_SHARED, fd, 0);
    if (str == MAP_FAILED) {
        perror("mmap");
        exit(-1);
    }

    printf("addr: %p\n", str);

    return 0;
}

示例输出:addr: 0x7fc761f6f000

是否甚至可以将某些文件映射到 2 48以上的地址mmap

如果没有,我如何利用“未使用的”bit48-bit63?

我只是好奇如何利用地址的高位。

操作系统:Ubuntu16.04

内存大小:4GB

答案1

如果您启用了五级页表(这为您提供了 56 位虚拟地址空间),或者您位于内核(使用地址空间的上半部分),则只能映射 2 48以上的任何内容。

请注意,“已使用”位上方的位不是未使用的,它们是保留的,并且必须等于最上面使用的位。 x86-64 定义规范形式,其中用户空间的地址以全零位开头,内核空间的地址以全一位开头。也可以看看内核的内存映射

相关内容