GDT это таблица т.е массив дескрипторов.
Дескриптор это 8 байт. Со сложной структурой, форматом данных.
Более того в 64-битном процессоре есть и 8 байтовые и 16 байтовые дескрипторы.
Код:
const MaxGDT=1024;
type
TDescriptor=array [0..7] of Byte;
var
GDT:array [0..MaxGDT-1]of TDescriptor;
const
GDTR:packed record
Limit:Word;
Base:DWord;
Reserv:Word;
end=(Limit:8*MaxGDT-1;Base:0;Reserv:0);
Нулевой элемент GDT зарезервирован для служебных нужд и должен содержать нулевой дескриптор.
Нулевой дескриптор это в котором все байты нулевые.
GDTR - это регистр который хранит описания таблицы GDT, а именно её лимит и базу. Reserv для выравнивания до 8 байт.
Для работы с регистром GDTR существуют 2 команды со странными названиями LGDT и SGDT
Собственно всё. Осталось только разобраться со структурой дескриптора и зачем он вообще нужен. В сегментный регистр CS, DS, ES, SS мы можем загрузить селектор.
Селектор состоит из фага выбора между таблицами GDT и LDT и индекса в этой таблице (и ещё RPL).
При загрузке селектора в теневую часть сегментного регистра копируется дескриптор из указанной таблице GDT\LDT.
По поводу дескриптора. Он имеет сложную структуру. Дескрипторы бывают 3 классов. Кода или данных или нулевой. В каждом классе дескриптора кода и данных есть свои типы.
Плюс есть лимит, есть базовый адрес, есть несколько флагов которые отвечают за защиту сегмента который описывает дескриптор. Сегмент это база+лимит.
Что конкретно не понятно?