我知道 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
如果您启用了 56 位虚拟地址空间的五级页表,或者如果您在内核中(使用地址空间的上半部分),则只能映射 2 48以上的任何内容。
请注意,“使用”位上方的位不是未使用的,它们是保留的,并且必须等于最顶部使用的位。x86-64 定义了一种规范形式,其中用户空间的地址以全零位开头,内核空间的地址以全一位开头。另请参阅内核的内存映射。