ページテーブル
前者の場合、メモリアクセスが不正であるため、オペレーティングシステムはその問題に何らかの対処を必要とする。例えば、問題のプログラムにセグメンテーション違反のシグナルを送ったりする。後者の場合、ページの内容は別の場所、例えばディスク内に格納されている。これに対処するにはページの内容をディスクから物理メモリに持ってくる必要がある。物理メモリに空きがあれば問題はなく、単にページの内容を空き物理メモリ領域に書き込んで、ページテーブルのエントリを書き換えて、TLBに同じマッピングを書き込んで命令を再実行すればよい。
しかし、物理メモリに空きがなく、使用可能なフレームがない場合、必要なページの内容を物理メモリ上に持ってくるために、別のページの内容をディスクに追い出す必要が生じる。そのフレームが使われていたページに対応するページテーブルのエントリを書き換えて「スワップアウト」されたことを示すようにし、逆に新たに持ってきたページに対応するページテーブルエントリに対応するフレーム番号を書き込む(当然ながら、TLBの処理と命令の再実行も必要)。このような処理を「スワッピング」と呼ぶ(プロセス全体のスワッピングのみをスワッピングと呼ぶこともある)。この処理はTLBだけ(あるいはメモリ上のページテーブル参照の場合も)のときに比べて非常に時間がかかる。どのページをスワップするかはページ置換アルゴリズムで決定される。
設計上意図されたわけではないが、ページテーブルをルートキットで操作してソフトウェアのコードを隠すことができる。このような操作は検出が困難であり、不正なソフトウェアを隠しておく効果がある。
ワード長が32ビットのコンピュータについて考えてみる。アドレス範囲は 0x00000000 から 0xFFFFFFFF までの 4Giバイトとなる。このアドレス範囲が仮想アドレス空間となる。仮想記憶を使用しない場合、物理メモリが16Miバイトしかないなら 0x01000000 以上のアドレス範囲は不正なアドレスとなる。しかし、多くのプログラムは4Gバイトのメモリを一度に全部使用するわけではない(参照の局所性、ワーキングセット参照)。例えば、あるプログラムはテキストとデータとスタックの最大値を合計しても1メガバイトに満たないだろう。
4Giバイトのアドレス空間はあるサイズのかたまり(一般的には4Kiバイト)に分割される。このかたまりを「ページ」と呼ぶ。物理メモリも同じサイズに分割される。こちらは「フレーム」と呼ぶ。例えば、プログラムのテキストセグメントはアドレス 0x00000004(ページ番号 0x0、ページ内オフセット 0x4)からスタートするかもしれないが、対応する物理アドレスは 0xFF0E0004(フレーム番号 0xFF0E、フレーム内オフセット 0x4)かもしれない。