OS

  • 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_ はセグメントのバイト数 - 1

    • limit_high(4) + limit_low(16) で20bit
    • 64bitモードでは無視されるらしい
  • type はデスクリプタのタイプ

  • system_segment が1であれば、そのセグメントはコード或いはデータセグメントとなる

  • descriptor_privilege_level 、略してDPLはそのデスクリプタの権限レベル

    • CPUが参照するコードセグメントを切り替える際、DSPの値がCPU権限レベルとなる
      • 切り替えはCS及びSSを書き換えることで行われる
    • 0-3で指定
    • type によって意味が変わるらしい?
  • present が1であれば、そのデスクリプタが有効

  • available は自由に使って良いらしい

  • long_mode が1であれば、そのデスクリプタは64ビットモード用のコードセグメントとなる

  • default_operation_size は、long_mode が1のときは必ず0になる

  • granularity が1であれば、limit_ を4KiB単位で解釈する

  • GDT[0] はnull descriptorと呼び、使われない

    • 全て0にしておく