PR
(注:記事は執筆時の情報に基づいており,現在では異なる場合があります)

PAE形式のエントリを利用

図2●独立した実行許可属性が存在しない
メモリー・ページの管理情報である「PTE」(Page Table Entry)や「PDE」(Page Directory Entry)には,独立した実行許可属性が存在しない。そのため読み出しを許可したページは,プログラムの実行も許可される。
図3●PAE(Physical Address Extention)の仕組み
ページ・テーブルを1段増やすことで,より大きな物理メモリーに対応する仕組みである。PAE利用時にはPTEやPDEは64ビット幅に拡張される。
図4●PAE利用時のPTEとPDE
サイズが64ビット幅になり未使用領域もある。AMD社は,従来未使用だった最上位ビットをNXフラグに設定した。
図5●ロング・モードでのアドレス変換
PAEを拡張し,さらにもう1段のページ・テーブルを用意する。これにより互換性を確保しながら,64ビット仮想アドレスを利用できる。

 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フラグとして使う点は同じである。