Защищенный режим процессоров Intel 80286 80386 80486


Детальное описание схемы преобразования адресов - часть 5


Так делается всегда. Самый первый дескриптор в таблицах GDT и LDT никогда не используется. Программа может загрузить в сегментный регистр селектор, соответствующий первому дескриптору (поле индекса в таком селекторе равно нулю), однако при попытке использовать такой селектор произойдёт прерывание работы программы. Селектор с нулевым полем индекса (пустой селектор) загружается операционной системой в неинициализированные сегментные регистры перед передачей управления запущенной программе.

Второй дескриптор описывает саму таблицу GDT, в поле предела стоит значение GDT_SIZE-1. Это предел таблицы GDT. В поле доступа стоит значение, соответствующее сегменту данных.

Следующие три дескриптора описывают сегменты, адресуемые регистрами ds, cs и ss соответственно (сегменты данных, кода и стека). В них заполнены поля предела и доступа. Эти поля могут быть определены, например, следующим образом: CODE_ACC equ 10011000b DATA_ACC equ 10010000b

В нашем примере мы заполнили не все поля дескрипторов в таблице GDT. Остались незаполненными поля base_lo и base_hi, т.е. физический адрес сегмента данных.

Физический адрес сегмента данных должен быть вычислен в реальном режиме на основании значений сегментного адреса и смещения, т.е. на основании двух компонент логического адреса реального режима. Можно предложить следующую процедуру для вычисления физического адреса (на примере вычисления физического адреса таблицы GDT) и записи вычисленного адреса в дескриптор: ; Загружаем в ax адрес сегмента данных DGROUP mov ax,DGROUP ; Формируем в dl:ax физический адрес, соответствующий ; сегментному адресу DGROUP mov dl,ah shr dl,4 shl ax,4 ; Складываем со смещением add ax,OFFSET gdtadr adc dl,0 ; Записываем физический адрес GDT в элемент GDT, ; описывающий саму GDT mov bx,OFFSET gdt_gdt mov [(desc_struc bx).base_l],ax mov [(desc_struc bx).base_h],dl

Аналогично заполняются и другие элементы таблицы GDT.

Так как дескриптор с адресом gdt_gdt описывает саму таблицу GDT (и формат этого дескриптора подходит для команды LGDT), его можно использовать для загрузки регистра GDTR: lgdt [QWORD gdt_gdt]

Если вы создаёте программу на языке Си, глобальная таблица дескрипторов GDT может быть определена с помощью типа descriptor следующим образом: descriptor gdt[5];

В этом примере создаётся таблица GDT, содержащая пять дескрипторов.


- Начало -  - Назад -  - Вперед -