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ビットで始まります。また、見ることができますカーネルメモリマップ。