Mmap
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
如果您啟用了 56 位虛擬地址空間的五級頁表,或者如果您在核心中(使用地址空間的上半部分),則只能映射 2 48以上的任何內容。
請注意,“使用”位上方的位不是未使用的,它們是保留的,並且必須等於最頂部使用的位。x86-64 定義了一種規範形式,其中使用者空間的地址以全零位開頭,核心空間的地址以全一位開頭。另請參閱核心的記憶體映射。