仮想アドレスと物理アドレスの対応付けを行うページングの内容を見ていきます。コアな OS や CPU の内容までは踏み込みません。
ここでは、64bit OS、x86_64アーキテクチャの CPU などで使用される標準的な 4レベルのマルチレベルページテーブルと呼ばれるページテーブルを扱います。ページテーブルはコンピュータの物理的なメモリ資源を効率的かつ安全に利用するためのシステムです。
ページテーブルは階層化された表データ
コンピュータはあくまで計算機なので、仮想化された空間をそのまま表現することはできません。コンピュータは階層化された表データで仮想的にアドレス空間を表現しています。

これらの表データが仮想アドレス空間です。各表データは OS が管理する RAM の物理メモリに保存されます。
物理アドレスへの変換
#include <stdio.h>
int main() {
int val = 1;
printf("メモリアドレス : %p\n", &val);
return 0;
}
上記のコードの結果が下記の場合だとします。
メモリアドレス : 0000001CAA52F774
そして、対応する物理アドレスが「1E56FF774」だった場合の物理メモリへの変換工程を追っていきます。
0000001CAA52F774 を 2進数へ変換すると「1110010101010010100101111011101110100」になります。
これが各テーブルのインデックスとオフセットを表します。内訳が下記です。64bit OS、x86_64アーキテクチャの CPU の場合です。

これを上記の図に当てはめると下図のようになります。

オフセット部分は コンピュータのしくみ⑤ 仮想アドレスと物理アドレス で解説しています。
まとめ
論理上の変数からその変数の値が格納されている物理アドレスへの変換までの工程を見てきました。

ページテーブルは OS が構築し、プログラム上では CPU が利用します。セキュリティを担保するため、プログラムは直接ページテーブルにアクセス・編集できるようには作られていません。
次回からはこれらのデータがどのように作られるか、どのように RAM にロードされるかを見ていきます。
参考サイト:

LEAVE A REPLY