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


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


В противном случае при попытке чтения выполнение программы будет прервано.

Поле D задаёт направление расширения сегмента. Обычный сегмент данных расширяется в область старших адресов (расширение вверх). Если же в сегменте расположен стек, расширение происходит в обратном направлении - в область младших адресов (расширение вниз). Для сегментов, в которых организуются стеки, необходимо устанавливать поле D равным 1.

Дескрипторы системных сегментов содержат поле TYPE, определяющее тип системного сегмента. В таблице 1 приведены возможные для этого поля значения.

Таблица 1. Типы системных сегментов.

Поле TYPEТип сегмента
0Запрещённое значение
1 Доступный TSS для процессора i80286
2 Сегмент LDT
3 Занятый TSS для процессора i80286
4 Вентиль вызова для процессора i80286
5 Вентиль задачи для процессоров i80286 и i80386
6 Вентиль прерывания для процессора i80286
7 Вентиль исключения для процессора i80286
8 Запрещённое значение
9 Доступный TSS для процессора i80386
AЗарезервировано
BЗанятый TSS для процессора i80386
CВентиль вызова для процессора i80386
DЗарезервировано
EВентиль прерывания для процессора i80386
FВентиль ловушки для процессора i80386

Мы на время отложим детальное описание всех типов системных дескрипторов, так же как и поля DPL, использующееся для организации защиты сегментов, для того чтобы сконцентрировать своё внимание на схеме преобразования адресов в процессоре i80286.

Итак, перед переводом процессора в защищённый режим нам необходимо сформировать в памяти таблицу GDT и загрузить в регистр GTDR её адрес и предел при помощи команды LGDT.

В терминах языка ассемблера структура дескриптора может быть описана следующим образом: STRUC desc_struc limit dw 0 ; предел сегмента base_lo dw 0 ; младшее слово 24-битового ; физического адреса сегмента base_hi db 0 ; старший байт 24-битового ; физического адреса сегмента access db 0 ; поле доступа reserved dw 0 ; зарезервировано, для сегментов ; процессора i80286 должно быть ; равно нулю ENDS desc_struc

Тогда мы можем определить таблицу GDT как набор дескрипторов со структурой desc_struc: GDT_BEG = $ ; отмечаем начало GDT LABEL gdtadr WORD gdt_0 desc_struc <0,0,0,0,0> ;первый элемент не используется gdt_gdt desc_struc <GDT_SIZE-1 ,,,DATA_ACC, 0> gdt_ds desc_struc <DSEG_SIZE-1 ,,,DATA_ACC,0> gdt_cs desc_struc <CSEG_SIZE-1 ,,,CODE_ACC,0> gdt_ss desc_struc <STACK_SIZE-1,,,DATA_ACC,0> GDT_SIZE = ($ - GDT_BEG) ; вычисляем размер GDT

В этом примере самый первый дескриптор инициализируется нулями.


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