mmap - 2^48以上のアドレスにマッピング

mmap - 2^48以上のアドレスにマッピング

64ビットPCで使用されているアドレス空間があることはわかっていますが、mmapを使用してファイルを2から48[0,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

ステップ5ページテーブルを有効にした場合(56ビット仮想アドレス空間を提供)、またはカーネルにある場合(アドレス空間の上半分を使用)、2 48以上のエントリのみをマッピングできます。

「使用済み」ビットの上のビットは未使用で予約されており、最上位の使用ビットと同じでなければなりません。 x86-64 定義正式形式ここで、ユーザー空間のアドレスはすべて0ビットで始まり、カーネル空間のアドレスはすべて1ビットで始まります。また、見ることができますカーネルメモリマップ

関連情報