11/07/94 03:24pm
zr_pradr.lek
А.В.Фролов, Г.В.Фролов "Защищенный
режим процессоров Intel 80286/80386/80486.
Практическое руководство по
использованию защищенного
режима" БСП том 6 М
"Диалог-МИФИ" 1993
В.Б.Бродин, И.И.Шагурин
"Микропоцессор i486. Архитектура,
программирование, интерфейс" М
"Диалог-МИФИ" 1993
Детальное описание элементов преобразования адресов.
Длина таблицы, уменьшенная на единицу называется ПРЕДЕЛОМ ТАБЛИЦЫ (GDT limit) и служит для проверки правильности задаваемых программой селекторов. Перед переходом в защищенный режим должна быть сформирована соответствующая таблица дескрипторов и ее пареметры загружены в регистр. Дескрипторы (описатели сегментов) таблицы базовых адресов содержит следующие поля (от младших байт к старшим):
ПРЕДЕЛ (16 бит) - размер сегмента, уменьшенный на единицу;
БАЗОВЫЙ АДРЕС (24 бита) - содержит физический адрес сегмента, описываемого данным дескриптором;
ДОСТУП (8 бит) - описывает тип сегмента (что содержится);
РЕЗЕРВ (16 бит) - в i286 нули, в i386 + старшая часть физического адреса и дополнительная информация.
ПРИМЕЧАНИЕ: Назначение полей может меняться в зависимости от значения поля "доступ".
При работе процессор отслеживает попытки обращения за пределы описанного сегмента. Поле доступа, расположенное в 5-ом байте дескриптора, служит для классификации дескрипторов и существует в трех форматах. Конкретный формат определяется его битом 4 (бит S) и если S=1, то битом 3 (бит E).
СИСТЕМНЫЙ СЕГМЕНТ описывает дескрипторы таблиц LDT, дескрипторы сегментов состояния задачи TSS, дескрипторы шлюзов.
СЕГМЕНТ КОДА (ПРОГРАММ) описывает области памяти, хранящие исполняемый код.
СЕГМЕНТ ДАННЫХ -описывает области, отведенные для хранения данных программы и областей стека.
Назначение битов:
P (Присутствие) - определяет наличие соответствующего сегмента в ОП (=1);
DPL (Уровень привелегий) - в зависимости от соотношений значений DPL и
RPL разрешается или запрещается обращение к данному сегменту;
C (Подчинение) - определяет дополнительные правила в системе защиты (при =0 более жесткие условия, если =1 то сегмент СОГЛАСОВАННЫЙ (конформный) - к нему могут обращаться сегменты с меньшим уровнем привелегий);
R (Считывание) - разрешает исполнение кода, но запрещает его чтение как данных (=0);
A (Обращение) - помечает сегменты к которым были обращения для реализации механизма выгрузки невостребованных страниц;
ED (Направление) - определяет какая часть сегмента относително базового адреса будет использоваться (=1 для стека и 0 для остальных);
W (Запись) - разрешает запись в сегменты данных (=1).
Типы системных сегментов:
0h Запрещенное значение;
1h Доступный TSS для процессора i286 (помечается задача к которой можно обратиться в данный момент);
2h Сегмент LDT - обеспечивают обращение к локальной таблице дескрипторов для выбора сегментов, используемых при выполнении текущей задачи;
3h Занятый TSS для процессора i286 - подобный тип используется в многозадачных системах для определения текушего состояния задачи (помечается используемая в данный момент задача) и адресации ее сегмента состояния задачи;
4h Шлюз вызова для процессора i286 - подобный тип используется для обращения к подпрограммам при наличии ограничений по привилегиям;
5h Шлюз задач используется для вызова самостоятельных программных модулей;
6h Шлюз прерывания для процессора i286;
7h Шлюз исключения для процессора i286;
8h Запрещенное значение;
9h Доступный TSS для i386+;
Ah Резерв;
Bh Занятый TSS для i386+;
Ch Шлюз вызова для процессора i386+;
Dh Резерв;
Eh Шлюз прерывания для процессора i386+;
Fh Шлюз исключения для процессора i386+.
ПРИМЕЧАНИЕ: Шлюзы еще называвают ВЕНТИЛЯМИ обращений.
Пример создания таблицы GDT (для i286):
; Определения структур данных и констант
STRUC desc_struc ; структура дескриптора
limit dw 0 ; предел
base_l dw 0 ; мл. слово физического адреса
base_h db 0 ; ст. байт физического адреса
access db 0 ; байт доступа
rsrv dw 0 ; зарезервировано
ENDS desc_struc
; Биты байта доступа
ACC_PRESENT EQU 10000000b ; сегмент есть в памяти
ACC_CSEG EQU 00011000b ; сегмент кода
ACC_DSEG EQU 00010000b ; сегмент данных
ACC_EXPDOWN EQU 00000100b ; сегмент расширяется вниз
ACC_CONFORM EQU 00000100b ; согласованный сегмент
ACC_DATAWR EQU 00000010b ; разрешена запись
; Типы сегментов
; сегмент данных
DATA_ACC = ACC_PRESENT OR ACC_DSEG OR ACC_DATAWR
; сегмент кода
CODE_ACC = ACC_PRESENT OR ACC_CSEG OR ACC_CONFORM
; сегмент стека
STACK_ACC = ACC_PRESENT OR ACC_DSEG OR ACC_DATAWR OR ACC_EXPDOWN
; Глобальная таблица дескрипторов GDT,
; содержит следующие дескрипторы:
; gdt_0 - дескриптор для пустого селектора (при работе не
; используется)
; gdt_gdt - дескриптор для GDT (для возможности модификации при работе)
; gdt_ds - дескриптор для сегмента, адресуемого DS
; gdt_cs - дескриптор для сегмента кода
; gdt_ss - дескриптор для сегмента стека
GDT_BEG = $
LABEL gdtr 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,,,STACK_ACC,0>
GDT_SIZE = ($ - GDT_BEG) ; размер таблицы дескрипторов
ПРИМЕЧАНИЕ:
В таблице не определены размеры
областей и их адреса; эти значения
определяются исходя из
потребностей загружаемой
программы и ее фактического
положения в памяти.
Загрузить в соответствующий
регистр данные о таблице можно
после доопределения ее компанент
командой: lgdt [QWORD gdt_gdt]
Уточненный алгоритм формирования физического адреса процессором i80286 в защищенном режиме:
В соответствии с битом TI CЕЛЕКТОРА выбирается регистр GDTR или LDTR;
По значению поля INDEX селектора и поля LIMIT регистра определяется наличие соответствующего дескриптора в таблице;
Выбирается из ОП необходимый дескриптор и проверяется возможность доступа к описываемому сегменту памяти по контексту обращения (код, данные, системная информация, привелегии и ограничения на чтение и запись);
По значению СМЕЩЕНИЯ и полей ПРЕДЕЛ и ДОСТУП (бит ED) проверяется отсутствие выхода за границу требуемого сегмента;
Вычисляется физический адрес и осушествляется обращение к ячейке, если она присутствует в памяти.