Адресация и многозадачность: Дескрипторы |
Программирование - Архитектура и система команд микропроцессоров x86 | |||
Ниже на рис. 2.10. ... 2.16. представлены форматы всех возможных типов дескрипторов для Intel386 и т.д. (32-битные дескрипторы). 16-битные дескрипторы процессора Intel286 для совместимости поддерживаются и всеми последующими процессорами, они во всем аналогичны 32-битным дескрипторам, за исключением того, что старшее слово старшего двойного слова в них описано как зарезервированное, и при запуске программ Intel286 на 32‑разрядных процессорах должно быть нулевым.
Рис. 2.10. Формат дескриптора сегмента данных
Рис. 2.11. Формат дескриптора сегмента кода
Рис. 2.12. Формат дескриптора 32-битного шлюза вызова
Рис. 2.13. Формат дескриптора 32-битного TSS
Рис. 2.14. Формат дескриптора шлюза задачи
Рис. 2.15. Формат дескриптора 32-битного шлюза прерывания
Рис. 2.16. Формат дескриптора 32-битного шлюза ловушки
Бит доступа устанавливается процессором после загрузки в сегментный регистр селектора соответствующего сегмента кода или данных. Предварительно очистив бит A, программное обеспечение может позже проверить, осуществлялся ли доступ к сегменту. Процессоры Intel486 … осуществляют цикл записи в память нового значения бита A = 1, только если он не был установлен; Intel286 и Intel386 делают это независимо от его текущего значения.
Бит оставлен свободным и может использоваться системным ПО для своих нужд.
Бит размерности присутствует в дескрипторах сегментов данных. Он управляет следующими аспектами операций.
Бит размерности всегда должен устанавливаться в 0 для 16-битных сегментов и в 1 для 32-битных сегментов.
BASE (База: Intel286 – 24 бита, Intel386 … – 32 бита) Задает положение сегмента в 4 Гбайтном (16М для Intel286) адресном пространстве. Для максимального быстродействия рекомендуется, чтобы значение базы было выровнено по 16 байтным границам. Для дескрипторов Intel286 определены только младшие 24 бита этого поля.
Кодовый сегмент может быть согласованным или несогласованным. Передача управления из сегмента с меньшим уровнем привилегий (мало привилегий) в сегмент с большим уровнем привилегий (много привилегий) требует, чтобы сегмент, в который передается управление, был согласованным, иначе генерируется особая ситуация общей защиты #GP (кроме случая использования ловушки задачи).
Для 32-битного шлюза задает количество двойных слов, копируемых из стека вызывающей процедуры в стек вызываемой. В случае 16-битного шлюза, задает количество слов, копируемых из стека вызывающей процедуры в стек вызываемой.
D (Разрядность по умолчанию: Intel386 …) Задает разрядность операндов и адресов, принимаемую по умолчанию (разрядность по умолчанию может быть изменена префиксом размера операнда и префиксом размера адреса). Если D = 1, то устанавливается режим 32-битных операндов и 32-битного адреса. Если D = 0, то адреса и операнды 16-битные.
DPL (Уровень привилегий дескриптора: Intel286 …) Задает уровень привилегий сегмента или шлюза, который (уровень) используется механизмом защиты для контроля доступа к сегменту или шлюзу. Наивысшие привилегии имеет уровень 0, наименьшие — уровень 3. В зависимости от способа доступа и типа сегмента, DPL выполняет следующие функции:
Задает направление расширения сегмента.
Бит гранулярности задает масштаб поля LIMIT. Когда G = 0, предел задается в байтах, если G = 1 — в 4-Кбайтных блоках.
LIMIT (Предел: Intel286 – 16 бит, Intel386 … – 20 бит) Задает размер сегмента. Процессор может интерпретировать это поле двумя способами в зависимости от значения поля G (гранулярность).
Для сегментов, расширяющихся вверх, логический адрес может принимать любое значение от 0 до LIMIT. Для сегментов, расширяющихся вниз (стековые сегменты), смысл поля LIMIT переворачивается, т.е. логический адрес может принимать любые значения кроме значений от 0 до LIMIT. Для дескрипторов Intel286 определены только младшие 16 бит этого поля, а размер сегмента всегда задается только в байтах.
Смещение точки входа в целевом сегменте.
Бит присутствия сегмента в физической памяти. Если этот бит не установлен, процессор генерирует особую ситуацию #NP (Сегмент не присутствует), когда селектор дескриптора загружается в сегментный регистр.
R (Разрешение чтения: Intel286 …) Бит R разрешает/запрещает чтение из кодового сегмента. Когда чтение запрещено программы могут передавать управление в сегмент (т.е. он остается исполняемым), но чтение кода как данных из сегмента невозможно.
S (Системный, бит 12 старшего двойного слова дескриптора: Intel286 …) Задает вид дескриптора. Если S = 0, то дескриптор считается системным. Если S=1, то это дескриптор сегмента кода или данных. Системные дескрипторы выполняют важнейшие функции по управлению прерываниями, вызовами подпрограмм, переключениями задач. Тип системного дескриптора задается полем TYPE.
SELECTOR (Селектор: Intel286 …) Селектор целевого сегмента или (для шлюза задачи) селектор TSS целевой задачи.
TYPE (Тип, биты 11..8 старшего двойного слова дескриптора: Intel286 …) Поле тип содержит биты, которые задают назначение (тип) системного дескриптора. TYPE Описание
W (Разрешение записи: Intel286 …) Бит разрешения/запрещения записи в сегмент данных.
|
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru