PAE形式のエントリを利用
x86互換プロセッサでは,従来,メモリー・ページに実行許可属性と読み出し許可属性を独立して設定できなかった。そのため,あるメモリー・ページで読み出しを許可すると,そのページでは同時にプログラムも実行可能になっていた。
これは,各メモリー・ページの管理情報である「PTE」(Page Table Entry)や「PDE」(Page Directory Entry)に実行許可属性を示す単独のフラグが存在しなかったためである。アクセス許可属性は図2[拡大表示]の通り,PTEとPDEの1ビット目で設定する。ここを「0」にすると「読み出しと実行を許可」,「1」にすると「読み出しと実行と書き込みを許可」になる。つまりどうやっても実行許可属性と読み出し許可属性を独立して設定できない。
新規にフラグを増設すれば良いいのだが,PTEにもPDEにも空きがない。かといって役割を変更すると互換性を損なってしまう。
そこでAMD社が目を付けたのが「PAE」(Physical Address Extention)である。PAEとは,メモリー・ページを参照する際に使うテーブルを従来の2段から3段に増やすことで,利用できる物理メモリー量を増やす仕組みである(図3[拡大表示])。Pentium Pro以降のx86プロセッサに搭載されており,これを利用すると最大64Gバイトまでの物理メモリーをサポートできる(通常では最大4Gバイト)。
PAEを有効にすると,PTEやPDEは32ビットから64ビットに拡張される。しかも,拡張された各エントリの36ビット目以降は使われていない。この未使用領域に新しいフラグを設定すれば,実行許可属性を独立して設定できる。ただし,未使用領域の低位部分は,対応物理メモリー量を増やした場合に使われる可能性がある。事実,AMD64アーキテクチャでは,ベース・アドレス領域を51ビット目まで拡張している。そこで,AMD社では最上位の63ビット目にNXフラグを設定した(図4[拡大表示])。
これにより互換性の問題は無くなった。しかしその代わり,常にPAEを有効にしなければならない。図3で分かる通り,PAE有効時には,メモリー・アクセス時に参照するテーブル数が増えるため,若干性能が落ちる。
なお,PAEは仮想アドレス空間が64ビットになる「ロング・モード」でも拡張された形で利用されている(図5[拡大表示])。テーブルの段数などの違いはあるが,各テーブルのエントリが64ビット長となり,その最上位ビットをNXフラグとして使う点は同じである。