Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 6004.doc
Скачиваний:
20
Добавлен:
30.04.2022
Размер:
1.29 Mб
Скачать

2.4.2.Преобразование логического адреса в физический в реальном режиме

Компоненты логического адреса располагаются в сегментном регистре и регистре-указателе (или РОН):

CS:IP

Seg:OffSet

Адрес реального режима Intel 8086 является 20-ти разрядным, что позволяет адресовать пространство в 1 Мб памяти. Чтобы из двух 16-ти разрядных компонент получить 20-ти разрядный адрес, используем алгоритм: сегмент сдвигаем влево на 1 шестнадцатеричную цифру (4 разряда) и складываем со смещением.

Пример: 40:1С - логический адрес

0040: 001С - слова сегмента и смещения

--------------

00400 - сдвиг сегмента влево

+

001С - сложение со смещением

-----

0041С - физический адрес

Такая схема позволяет создавать хорошо перемещаемые программы.

Недостатки:

1) позволяет адресовать память небольшого размера;

2) нет возможности организовать защиту отдельных сегментов памяти от несанкционированного доступа;

3) невозможно установить уровень привилегий для различных категорий выполняемых задач.

2.4.3.Адресация памяти в защищенном режиме

В защищенном режиме применяются две схемы адресации: одноступенчатая и двухступенчатая. В любом случае оперируют понятиями логического и физического адреса.

Физический адрес получается из логического при одноступенчатой схеме за одно преобразование, а при двухступенчатой - за два.

Логический адрес состоит из двух компонент: селектора и смещения. Селектор содержит индекс в таблице дескрипторов (описателей) сегментов. Селектор имеет следующую структуру:

RPL - запрашиваемый уровень привилегий (2 бита);

TI - индикатор таблицы: 0- поиск дескриптора выполняется в глобальной дескрипторной таблице GDT, 1 - поиск осуществляется в локальной дескрипторной таблице LDT.

GDT содержит дескрипторы сегментов ОС, а также адреса локальных таблиц. В системе может быть только одна глобальная таблица дескрипторов. Для адресации таблиц используются регистры GDTR (рис. 8) и LDTR.

Рис. 8. Формат регистра GDTR

Предел хранит протяженность таблицы. Поле предела позволяет контролировать обращение к таблице по индексу. Базовый адрес таблицы показывает реальный адрес расположения таблицы в основной памяти.

Регистр глобальной таблицы загружен постоянным содержимым, а значение локального регистра меняется при переключениях между локальными дескрипторными таблицами.

Схема одноступенчатого преобразования адреса представлена на рис. 9.

Рис. 9. Одноступенчатого преобразования адреса

Записи с нулевым индексом в таблицах не используются.

Структура дескриптора сегмента:

Поле предела служит для контроля и защиты адресов данного сегмента. Протяженность поля - 20 разрядов (16+4).

G - бит гранулярности, который позволяет по-разному интерпретировать поле предела. G=1 - предел указывает максимальное число страниц в сегменте (1 страница - 4К); G=0 - размер сегмента указан в байтах.

Х указывает разрядность команды: 1- 32-хразрядные, 0- 16-тиразрядные.

AVL - бит, используемый ОС.

Доступ - структура, которая описывает тип сегмента. Различают сегменты кода, данных и системный (рис. 10.).

Рис. 10. Типы сегментов

P, A - предназначены для организации виртуальной памяти;

А - бит обращения к сегменту, устанавливается в 1 для тех сегментов, к которым было обращение. Сбрасывается в 0 процессором;

Р - бит присутствия сегментов в памяти;

DPL - двухбитовое поле - номер кольца защиты сегмента (допустимый уровень привилегий), максимальная привилегия 0, минимальная - 3;

С - бит подчинения. С=0 - сегмент может быть вызван только программой с не менее высоким приоритетом, чем у самого сегмента, С=1 - сегмент может быть вызван любой программой, но уровень привилегий выставляется как у вызывающей программы;

R - бит разрешения чтения.

D - направление расширения сегмента. D=1 - сегмент расширяется вниз от старших адресов к младшим (стек), D=0 - наоборот;

W - возможность записи в сегмент. W=1 - запись разрешена, W=0 - разрешено только чтение. С помощью этого бита можно установить дополнительный уровень защиты сегмента.

TYPE - тип того или иного сегмента. Код, который задан в этом поле, определяет назначение сегмента. Различают следующие виды:

- TSS - сегмент состояния задачи

- LDT - сегмент локальной дескрипторной таблицы

- вентиль вызова

- вентиль прерывания

- вентиль исключения.

Вентиль - точка входа или адрес в ту или иную функцию или подпрограмму. Исключение - особая ситуация, возникающая при исполнении приложения: деление на 0, исчезновение порядка, отсутствие страницы в основной памяти.