В противном случае при попытке
В противном случае при попытке чтения выполнение программы будет прервано.
Поле 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
В этом примере самый первый дескриптор инициализируется нулями.
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий