logo
Методичка

4.3.2 Дескрипторные регистры

GDTR (Global Descriptor Table Register – регистр глобальной дескрипторной таблицы) – специальный 48-битный регистр, который описывает местоположение и размер таблицы, содержащей дескрипторы. Он появился вместе с механизмом защиты в 80286 моделях процессоров как сегментный механизм защиты.

Регистр содержит два поля: первое поле – первые 32 бита, описывают физический адрес, по которому должна быть расположена дескрипторная таблица, а последние 16 бит – лимит, ограничение, которое накладывается на верхний дескриптор. Каждый дескриптор занимает в памяти по 8 байт, потому лимит всегда должен вычисляться так: limit = 8n ‑ 1, где n – количество дескрипторов.

При инициализации операционной системы глобальная дескрипторная таблица обычно создаётся на полное количество дескрипторов (limit = 65535), или 8192 дескрипторов. Затем вычисляется физический адрес начала таблицы, и загружается регистр GDTR специальной ассемблерной инструкцией LGDT (Load GDT):

mov AX, GDT_Limit

push AX

mov EAX, GDT_Base

push EAX

mov BP, SP

LGDT qword [SS:BP] ; Не забывайте, что стек растёт “вниз”!

После включения механизма защиты начинает действовать селекторная система адресации, вместо сегментной, и использоваться GDT.

LDTR (Local Descriptor Table Register – регистр локальной таблицы дескрипторов) – специальный 16-битный регистр, содержащий селектор сегмента LDT. Расположение в памяти и размер определяются соответствующими полями дескриптора. В настоящее время LDT используются только для выполнения 16-разрядных приложений.

Загрузка регистра LDTR осуществляется привилегированной командой LLDT (Load LDT):

LLDT word LDT_Seg

На 64-разрядных процессорах программы выполняются только в режиме памяти flat. Поэтому LDT не поддерживаются вовсе.