На самом деле это 8-байтовая запись в глобальной таблице дескрипторов.Он создает дескриптор, который обращается ко всему адресному пространству 4G в качестве селектора.
equ $-gdt
устанавливает значение в ассемблере, равное разнице между этим местоположением ($
) и меткой gdt
.Другими словами, это смещение этой записи в самом GDT.
Структура записи GDT следующая:
, где отдельные частипоясняются ниже.
Для ваших конкретных значений:
(a) dw FFFFh
(b) dw 0
(c) db 0
(d) db 92h ; present, ring 0, data, expand-up, writable
(e) db CFh ; page-granular (4 gig limit), 32-bit
(f) db 0
Базовый адрес рассчитывается по f
,Поля c
и b
, от наиболее значимых к наименьшим - поскольку все они равны нулю, база равна нулю.
Предел селектора вычисляется из самых правых 4 битовe
и все a
, чтобы дать 0xfffff
в этом случае.К этому добавили 1, чтобы дать 0x100000
.См. Пункт 3 ниже, чтобы узнать, что это значит.
Старшие 4 бита e
(флаги) устанавливают гранулярность (4 КБ, а не 1 байт) и размер операнда (32-немного).С гранулярностью 4K (12 бит) и количеством страниц 0x100000
(20 бит) это дает вам ваше полное 32-битное (4G) адресное пространство.
d
поле является байтом доступа и устанавливает следующие свойства на основе 0x92
:
Pr
текущий (в памяти) бит в значение true. Privl
уровень привилегийдо 0 (для получения доступа необходимо набрать 0). Ex
исполняемый бит 0 (селектор данных). DC
, бит направления равен 0, сегмент увеличивается. RW
из 1, память доступна для записи. Ac
бит доступа установлен на 0.