Mmap

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

  • May 14, 2019

我知道 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 定義了一種規範形式,其中使用者空間的地址以全零位開頭,核心空間的地址以全一位開頭。另請參閱核心的記憶體映射

引用自:https://unix.stackexchange.com/questions/518830