TLB flush

TLB が無効化される範囲とトリガー。

非グローバル全エントリ無効化
CR3 更新、32bit タスクスイッチ。
全エントリ無効化
PE, PG ビットが変更される CR0 更新、PSE, PGE, PAE ビットが変更される CR4 更新、INVD、WBINVD。
実効アドレスで指定したページを含むエントリを無効化
INVLPG

あ、下巻 p.341 9.10. に書いてあった…。

続 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 配下に登録されているページ全てで実行が不可になる、んだよね。