- Global Descriptor Table
- グローバルなのでシステムでひとつ
- LDTはアプリごと
- グローバルなのでシステムでひとつ
- セグメンテーションの設定に用いる
- 8バイト幅のデスクリプタ(Descriptor)を複数持つ配列
- デスクリプタは以下の通り
limit_low : 16
base_low : 16
base_middle : 8
type : 4
system_segment : 1
descriptor_privilege_level : 2
present : 1
limit_high : 4
available : 1
long_mode : 1
default_operation_size : 1
granularity : 1
base_high : 8-
base_はセグメントの開始アドレスbase_high(8) + base_middle(8) + base_middlebase_low(16)で32bit- 64bitモードでは無視されるらしい
-
limit_はセグメントのバイト数 - 1limit_high(4) + limit_low(16)で20bit- 64bitモードでは無視されるらしい
-
typeはデスクリプタのタイプ -
system_segmentが1であれば、そのセグメントはコード或いはデータセグメントとなる -
descriptor_privilege_level、略してDPLはそのデスクリプタの権限レベル -
presentが1であれば、そのデスクリプタが有効 -
availableは自由に使って良いらしい -
long_modeが1であれば、そのデスクリプタは64ビットモード用のコードセグメントとなる -
default_operation_sizeは、long_modeが1のときは必ず0になる -
granularityが1であれば、limit_を4KiB単位で解釈する -
GDT[0] はnull descriptorと呼び、使われない
- 全て0にしておく