Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка.doc
Скачиваний:
618
Добавлен:
22.05.2015
Размер:
2.56 Mб
Скачать

4.3 Защищённый режим

Основные термины, относящиеся к системе управления памятью процессоров семейства IA-32 в защищённом режиме.

  • Многозадачность позволяет одновременно запускать в операционной системе несколько программ (или задач). При этом каждой задаче выделяется небольшой квант времени процессора, в течение которого ЦПУ физически выполняет команды этой задачи.

  • Сегментами называются области памяти переменной длины, в которых хранится программный код или данные.

  • Благодаря поддержке механизма сегментации на аппаратном уровне удалось изолировать участки памяти один от другого. В результате выполняемые одновременно программы не могут повлиять друг на друга, что является достоинством защищённого режима.

  • Дескриптор сегмента – это 64-разрядное число, в котором зашифрована информация об одном сегменте памяти: его базовый адрес, права доступа, длина, тип и способ использования.

  • Селектор сегмента – это 16-разрядное число, которое загружается в сегментные регистры (CS, DS, SS, ES, FS или GS). По сути, оно является указателем дескриптора сегмента, расположенным в одной из системных таблиц дескрипторов.

  • Логический адрес – это комбинация селектора сегмента и 32-разрядного смещения.

  • Линейный адрес – целое число, имеющее разрядность шины адреса, по значению которого определяется физический адрес объекта в памяти.

Защищённый режим – наиболее развитый режим работы процессора, позволяющий организовать многозадачность, защиту ОС, а также защиту прикладных программ и их данных. При работе в защищенном режиме каждой программе может быть выделен блок памяти размером до 232 = 4 Гбайт, адреса которого в шестнадцатеричном представлении могут меняться от 00000000 до FFFFFFFF. При этом говорят, что программе выделяется линейное адресное пространство (flat address space), которое разработчики компилятора Microsoft Assembler назвали линейной моделью памяти (flat memory model). В защищенном режиме в сегментных регистрах (CS, DS, SS, ES, FS, GS) хранятся не 16-разрядные базовые адреса сегментов, а указатели на дескрипторы сегмента (segment descriptor), расположенные в одной из системных таблиц дескрипторов (descriptor table). Поэтому, по сути, сегментные регистры можно смело называть селекторными. Значение каждого селектора сообщает процессору адрес дескриптора.

4.3.1 Дескрипторные таблицы

Дескрипторные таблицы – служебные структуры данных, содержащие дескрипторы сегментов. В архитектуре intel86 есть три вида дескрипторных таблиц:

  1. Глобальная дескрипторная таблица (Global Descriptor Table, GDT);

  2. Локальная дескрипторная таблица (Local Descriptor Table, LDT);

  3. Таблица векторов прерываний (Interrupt Descriptor Table, IDT).

Глобальная дескрипторная таблица одна. Она общая для всех задач. Её размер и расположение в физической памяти определяются регистром GDTR. Дескрипторы LDT и сегментов задач (TSS) могут находиться только здесь. Особенностью GDT является то, что у неё запрещён доступ к первому (№0) дескриптору. Обращение к нему вызывает исключение #GP, что предотвращает обращение к памяти с использованием незагруженного сегментного регистра.

Локальных дескрипторных таблиц может быть много (соответственно количеству задач (потоков), но не обязательно). Каждая задача может иметь свою локальную таблицу. Размер и расположение LDT в линейной памяти определяются дескриптором LDT из GDT (но это не означает, что размер LDT может быть больше 65536 байт). Первый дескриптор LDT (№0) использовать можно.

Таблица векторов прерываний глобальна. Размещение в физической памяти определяется регистром IDTR. При возникновении прерывания (внешнего, аппаратного, или вызванного инструкцией int):

  • из IDT выбирается дескриптор шлюза, соответственно номеру прерывания;

  • проверяются условия защиты (права доступа);

  • при соблюдении условий защиты выполняется переход на подпрограмму обработки этого прерывания.

Таблица векторов прерываний (Interrupt Descriptor Table, IDT) используется в x86 архитектуре и служит для связи обработчика прерывания с вектором (номером прерывания).

В реальном режиме таблица векторов прерываний расположена в первом килобайте памяти, начиная с адреса 0000:0000, и содержит 256 векторов прерываний. В защищённом режиме адрес в физической памяти и размер таблицы прерываний определяется 48-битным регистром IDTR.

В IDT используются следующие типы прерываний: аппаратные прерывания, программные прерывания и прерывания, зарезервированные процессором, называемые исключениями (для реального режима – первые пять, для защищённого режима – первые 32) на случай возникновения некоторых событий (деление на ноль, ошибка трассировки, переполнение).

В реальном режиме элементом IDT является 32-битный FAR адрес обработчика прерывания.

В защищённом режиме элементом IDT является шлюз прерывания длиной 8 байт, содержащий сегментный (логический) адрес обработчика прерывания, права доступа и др.

Первый этап инициализации выполняется BIOS, перед загрузкой ОС. Второй – непосредственно самой операционной системой. Операционной системе доступно изменение некоторых адресов прерываний.