ゲストOSが実行するアプリケーションが新しいページを要求したり、ユーザ状態で実行するアプリケーションを切り替えるとゲストOSのページテーブルが変わり、それに対応してVMMはシャドーテーブルを書き換えなければならない。ゲストOSのページテーブルは普通のメモリ上にあるので、その書き換えを検出するため、ページテーブルを格納するメモリ領域を書込み禁止にして、ゲストOSがページテーブルのエントリを書き換えようとすると、特権違反が発生してVMMに制御が渡るようにする。そして、VMMは、この書き込みのアドレスを自分のページテーブルで再度変換して物理アドレスに変換してシャドーテーブルに書き込むという処理を行うので、書き換えの頻度にもよるが、一般的に、このゲストOSのページテーブルの書き換えにシャドーページテーブルを追従させる処理のオーバヘッドが、VMMの主要なオーバヘッドの1つとなっている。

この問題を解決する手法が、AMDがNested Page Table、IntelがEPTなどと呼ぶ2段階のアドレス変換をハードウェアが実行するやり方である。前述のように、x86アーキテクチャでは、TLBミスが発生するとハードウェアがページテーブルをたどって物理アドレスを得てTLBにセットするが、Nested Page Tableの場合は、ハードウェアはゲストOSのページテーブルをたどって得たゲスト空間のアドレスを入力として、再度、VMMのページテーブルをたどって物理アドレスに変換するという動作を行う。そして、この物理アドレスをTLBに書き込む。

この機構により、ゲストOSがページテーブルを書き換えても、VMMはシャドーページテーブルを作って書き換える必要が無くなり、VMMの2段階のアドレス変換のオーバヘッドが殆ど無くなり仮想化の性能が向上する。

もちろん、オーバヘッドはゼロというわけではない。145回で述べたように、アドレス空間が小さかった時には、1段のページテーブルで事足りたが、アドレス空間の拡大に伴い、ページテーブルは複数段となり、x64アーキテクチャ(64bit化されたx86アーキテクチャ)では4段の多段ページテーブルが用いられている。この場合、ゲストOSのテーブルウォークは、各段ごとにVMMのページテーブルを使って物理アドレスに変換してメモリアクセスを行う必要があるので、4段の場合は、ゲストOSのページテーブルの先頭アドレスの変換を含めると(1+4)×4=20回のメモリアクセスが必要となる。また、一定の容量のハードウェアTLBが複数のゲストOSのアドレス変換を行うために共用されるので、TLBミスが増加するという点でオーバヘッドが発生するが、シャドーテーブルを作る場合のオーバヘッドに比べると非常に小さいオーバヘッドである。

なお、IntelのVT、あるいはAMDのAMD-V以前のx86プロセサは、重要なハードウェア資源のアクセスでも例外を発生しないケースがあり、例外発生をVMMが検出して動作をエミュレーションして仮想化を行うという方法ではうまく行かないケースがあった。このため、この古いプロセサをサポートするVMwareなどのVMMでは、ゲストOSの実行の前に、OSのバイナリオブジェクトをスキャンして、ハードウェアでは例外を発生しないがVMMの介入が必要なケースを検出するとVMMを呼び出すようにオブジェクトを変更するバイナリトランスレーションを行って仮想化を実現している。