
プロセス モニターで特定のプロセスを選択してそのプロパティを選択すると、イベント プロパティの下にあるプロセス タブに個々のライブラリ ファイルのアドレスが表示されますが、これらのアドレスは何を参照しているのでしょうか。また、スタックの下のアドレスは仮想メモリの場所を指しているのでしょうか、それとも物理メモリの場所を指しているのでしょうか。
答え1
表示されるアドレスはすべて仮想です。これらは、プロセスの仮想アドレス空間内の DLL またはその他のマップされたファイルの開始アドレスです。[スタック] タブに表示されるアドレスも仮想です。
Process Explorer でも同様の内訳を見ることができます。下部のペインで「DLL ビュー」を有効にしてください。また、VMmap でも同様の内訳を見ることができますが、より詳細です。VMmap には、各実行可能ファイル内の「セクション」のアドレスが含まれています。コード用のセクションが 1 つ、読み取り専用データ用のセクションが 1 つ、「リソース」用のセクションが 1 つなど、さらにいくつかの制御情報があります。
x86/x64 上の仮想メモリ OS が物理アドレスを直接使用 (つまり参照) するのは、実際には非常に困難です。システムが「仮想化」すると (つまり、起動の非常に早い段階で CR0 の「ページング有効」ビットを設定すると)、実行中のコード (カーネル モードまたはユーザー モード) によってアサートされたすべてのアドレスは、CPU によって仮想アドレスとして解釈され、メモリ コントローラに提示される前に (ページ テーブルの情報を使用して) 物理アドレスに変換される必要があります。
もちろん、OS のカーネル コードは物理メモリを「管理」し (たとえば、それを必要とするプロセスに割り当てる)、ページ テーブル エントリと物理ページ番号を操作しますが、メモリの物理アドレスを介してメモリを直接「参照」することはできません。