No-Execute bit
AMD64 には実行不許可にできる機構が導入されている様なので調べてみた。
続 No-Execute bit
long mode でのアドレス変換の図、初めて見たとき思わず笑っちゃったよ。
ページサイズ 4Kbyte の場合。
Virtual Address 63 48 47 39 38 30 29 21 20 12 11 0 +-------------+----------------+----------------+----------------+----------------+-------------+ | | Page-Map | Page- | Page-Directory | Page-Table | Physical- | | Sign Extend | Level-4 Offset | Directory- | Offset | Offset | Page Offset | | | (PML4) | Pointer Offset | | | | +-------------+----------------+----------------+----------------+----------------+-------------+ |9 |9 |9 |9 |12 | | Page- | | | | Page-Map | Directory- | Page- | | 4Kbyte | Level-4 | Pointer | Directory | Page | Physical | Table | Table | Table | Table | Page | +---------+ | +---------+ | +---------+ | +---------+ | +---------+ | | | | | | | | | | | | | | | | | | | | | | | | | +---------+ 52 | | | | | | | | | | | | +>| PTE |-+ | | | | | | | | | | | | +---------+ | | | | | | | | | | | | | | | | | | | | | | | +---------+ 52 | | | | | | | | | | | | +>| PDPE |-+ | | | | | | | | | | | | +---------+ | | | | | | | | +---------+ | +---------+ 52 | | | | | | | | | +>| Physical| +>| PML4E |-+ | | | | | | | | | | Address | +---------+ | | | | | | | | | | +---------+ | | | | | | | | | | | | | | | | | | | | | +---------+ 52 | | | | | | | | | | | +>| PDE |-+ | | | | | | | | | | | +---------+ | | | | | | | | | | | | | | | | | | | | +-------------->+---------+ +--->+---------+ +--->+---------+ +--->+---------+ +--->+---------+ | | 63 52 51 12 11 0 | +--------------+-------------------------------+---------------+ +-| | Page-Map Level-4 Base Address | | CR3 +--------------+-------------------------------+---------------+
続々 No-Execute bit
ページサイズ 4Kbyte の場合、各テーブルのエントリ構造。
○ Page-Map Level-4 Table Entry (PML4E) 63 62 52 51 32 +--+-----------------------------+-----------------------------------------+ |NX| Available |Page-Directory-Pointer ベース物理アドレス| +--+-----------------------------+-----------------------------------------+ 31 12 11 9 8 7 6 5 4 3 2 1 0 +-----------------------------------------+------+---+-+-+---+---+---+---+-+ |Page-Directory-Pointer ベース物理アドレス|使用可|MBZ|?|A|PCD|PWT|U/S|R/W|P| +-----------------------------------------+------+---+-+-+---+---+---+---+-+ ○ Page-Directory-Pointer Table Entry (PDPE) 63 62 52 51 32 +--+-----------------------------+-----------------------------------------+ |NX| Available | Page-Directory ベース物理アドレス | +--+-----------------------------+-----------------------------------------+ 31 12 11 9 8 7 6 5 4 3 2 1 0 +-----------------------------------------+------+---+-+-+---+---+---+---+-+ | Page-Directory ベース物理アドレス |使用可|MBZ|?|A|PCD|PWT|U/S|R/W|P| +-----------------------------------------+------+---+-+-+---+---+---+---+-+ ○ Page-Directory Table Entry (PDE) 63 62 52 51 32 +--+-----------------------------+-----------------------------------------+ |NX| Available | Page-Table ベース物理アドレス | +--+-----------------------------+-----------------------------------------+ 31 12 11 9 8 7 6 5 4 3 2 1 0 +-----------------------------------------+------+-+-+-+-+---+---+---+---+-+ | Page-Table ベース物理アドレス |使用可|?|0|?|A|PCD|PWT|U/S|R/W|P| +-----------------------------------------+------+-+-+-+-+---+---+---+---+-+ ○ Page Table Entry (PTE) 63 62 52 51 32 +--+-----------------------------+-----------------------------------------+ |NX| Available | Physical-Page ベース物理アドレス | +--+-----------------------------+-----------------------------------------+ 31 12 11 9 8 7 6 5 4 3 2 1 0 +---------------------------------------+------+-+---+-+-+---+---+---+---+-+ | Physical-Page ベース物理アドレス |使用可|G|PAT|D|A|PCD|PWT|U/S|R/W|P| +---------------------------------------+------+-+---+-+-+---+---+---+---+-+
続々々 No-Execute bit
各エントリの最上位にある NX ビットが実行不許可フラグで、このビットが立っているページから命令を取得しようとするとページフォルトが発生する。
NX ビットを有効にする為には、PAE = 1 (64bit エントリが必要だから) かつ EFER(Extended Feature Enable Register) の NXE bit を 1 にしなければいけない、と。EFER.NXE = 0 の時に NX ビットが立っているページにアクセスするとページフォルトが発生する。
上位エントリの NX ビットは下位へ継承されるので、PML4E の NX ビットが 1 の場合には該当 PML4E 配下に登録されているページ全てで実行が不可になる、んだよね。