pshikoro's blog

休日プログラミング

GDT(Global segment Descriptor Table)とは

GDTとは大域セグメント記述子表の略である。

これを理解するには、セグメンテーションについて理解する必要がある。

セグメンテーションは各プログラムが使用するメモリ領域の区分けのことである。

各プログラムにはそのセグメント領域の起点からの相対アドレスが記述されている。
OSは実行時に各プログラムが使用するセグメント領域を割り振る。
CPUがメモリを操作する際は、プログラムに割り振られたセグメントを起点とした相対位置のメモリを操作する。

なぜこのような操作が必要かというと、OSなどの特殊なプログラムを除き、どのようなプログラムが同時に動作するかはプログラム作成者が知ることは基本的にできないため、操作するメモリの絶対位置を指定することができないからである。

GDTとはこのCPUがプログラムに記述された相対位置を絶対位置に変換する際に参照する、各プログラムに割り当てられたセグメントに関する設定が記述されたテーブルのことである。

このテーブルはそれなりのサイズになるので、メモリ上に配置される。

プログラム実行時にGDTのどのテーブルを参照するかは、セグメントレジスタに設定された値によって変更される。

またこのセグメントの用途としては、リングプロテクションの実装に用いられる。

つまりは、特定のセグメントのみをシステム用のセグメントとしてGDTに設定することで、それ意外のセグメント内での、GDT変更のような特権操作を防ぐことができる。