Адресация и многозадачность: Дескрипторы

Печать
Программирование - Архитектура и система команд микропроцессоров x86

 

Ниже на рис. 2.10. ... 2.16. представлены форматы всех возможных типов дескрипторов для Intel386 и т.д. (32-битные дескрипторы). 16-битные дескрипторы процессора Intel286 для совместимости поддерживаются и всеми последующими процессорами, они во всем аналогичны 32-битным дескрипторам, за исключением того, что старшее слово старшего двойного слова в них описано как зарезервированное, и при запуске программ Intel286 на 32‑разрядных процессорах должно быть нулевым.

 

Формат дескриптора сегмента данных

Рис. 2.10. Формат дескриптора сегмента данных

 

Формат дескриптора сегмента кода

Рис. 2.11. Формат дескриптора сегмента кода

 

Формат дескриптора 32-битного шлюза вызова

Рис. 2.12. Формат дескриптора 32-битного шлюза вызова

 

Формат дескриптора 32-битного TSS

Рис. 2.13. Формат дескриптора 32-битного TSS

 

Формат дескриптора шлюза задачи

Рис. 2.14. Формат дескриптора шлюза задачи

 

Формат дескриптора 32-битного шлюза прерывания

Рис. 2.15. Формат дескриптора 32-битного шлюза прерывания

 

Формат дескриптора 32-битного шлюза ловушки

Рис. 2.16. Формат дескриптора 32-битного шлюза ловушки

 

A (Доступ: Intel286 …)

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

Процессоры Intel486 … осуществляют цикл записи в память нового значения бита A = 1, только если он не был установлен; Intel286 и Intel386 делают это независимо от его текущего значения.

 

AVL (Свободный: Intel386 …)

Бит оставлен свободным и может использоваться системным ПО для своих нужд.

 

B (Размерность: Intel386 …)

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

  • Размерностью регистра указателя для стековых сегментов. Если B = 1, используется 32-битный указатель ESP. Если B = 0 — 16-битный указатель SP.
  • Верхней границей расширяемого вниз сегмента. В расширяемых вниз сегментах нижняя граница задается полем LIMIT, а верхняя равна FFFFFFFFh, если B = 1, и FFFFh, если B = 0.

Бит размерности всегда должен устанавливаться в 0 для 16-битных сегментов и в 1 для 32-битных сегментов.

 

BASE (База: Intel286 – 24 бита, Intel386 … – 32 бита)

Задает положение сегмента в 4 Гбайтном (16М для Intel286) адресном пространстве. Для максимального быстродействия рекомендуется, чтобы значение базы было выровнено по 16 байтным границам. Для дескрипторов Intel286 определены только младшие 24 бита этого поля.

 

C (Согласование: Intel286 …)

Кодовый сегмент может быть согласованным или несогласованным. Передача управления из сегмента с меньшим уровнем привилегий (мало привилегий) в сегмент с большим уровнем привилегий (много привилегий) требует, чтобы сегмент, в который передается управление, был согласованным, иначе генерируется особая ситуация общей защиты #GP (кроме случая использования ловушки задачи).

 

COUNT (Счетчик: Intel286 …)

Для 32-битного шлюза задает количество двойных слов, копируемых из стека вызывающей процедуры в стек вызываемой. В случае 16-битного шлюза, задает количество слов, копируемых из стека вызывающей процедуры в стек вызываемой.

 

D (Разрядность по умолчанию: Intel386 …)

Задает разрядность операндов и адресов, принимаемую по умолчанию (разрядность по умолчанию может быть изменена префиксом размера операнда и префиксом размера адреса). Если D = 1, то устанавливается режим 32-битных операндов и 32-битного адреса. Если D = 0, то адреса и операнды 16-битные.

 

DPL (Уровень привилегий дескриптора: Intel286 …)

Задает уровень привилегий сегмента или шлюза, который (уровень) используется механизмом защиты для контроля доступа к сегменту или шлюзу. Наивысшие привилегии имеет уровень 0, наименьшие — уровень 3. В зависимости от способа доступа и типа сегмента, DPL выполняет следующие функции:

  • Для сегмента данных. DPL содержит самое высокое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ к такому сегменту. Например, только программы с CPL = 0 или CPL = 1 могут обращаться к сегменту данных с DPL = 1. В случае стекового сегмента, при загрузке в регистр SS нового селектора необходимо, чтобы все привилегии (текущий CPL, RPL загружаемого селектора и DPL дескриптора) совпадали, в противном случае генерируется ошибка общей защиты (#GP).
  • Для несогласованного кодового сегмента. DPL содержит уровень привилегий, который должна иметь программ для доступа к сегменту. Например, если DPL = 2, то только программы с CPL = 2 могут обращаться к сегменту. При обращении к такому сегменту через шлюз вызова командой CALL, DPL содержит самое низкое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ. Например, только программы с CPL = 2 или CPL = 3 могут обращаться к сегменту с DPL = 2.
  • Для согласованного кодового сегмента и для сегмента TSS. DPL содержит самое низкое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ к такому сегменту (задаче). Например, только программы с CPL = 2 или CPL = 3 могут обращаться к сегменту с DPL = 2. При обращении к новой задаче через шлюз задачи поле DPL дескриптора TSS новой задачи не проверяется.
  • Для шлюзов. DPL содержит самое высокое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ к шлюзу. Например, только программы с CPL = 0 или CPL = 1 могут обращаться к шлюзу с DPL = 1. Для шлюза ловушки и шлюза прерывания процессор проверяет значение DPL, только если прерывание вызвано командами INT n, INT 3, INTO.

 

E (Расширяемость: Intel286 …)

Задает направление расширения сегмента.

  • E = 1 — сегмент расширяется вниз (стек);
  • E = 0 — сегмент расширяется вверх.

 

G (Гранулярность: Intel386 …)

Бит гранулярности задает масштаб поля LIMIT. Когда G = 0, предел задается в байтах, если G = 1 — в 4-Кбайтных блоках.

 

LIMIT (Предел: Intel286 – 16 бит, Intel386 … – 20 бит)

Задает размер сегмента. Процессор может интерпретировать это поле двумя способами в зависимости от значения поля G (гранулярность).

  • Если G = 0, то предел задает размер сегмента в байтах (от 1 байта до 1 Мбайта).
  • Если G = 1, то предел задает размер сегмента в 4-Кбайтных параграфах (от 4 Кбайт до 4 Гбайт).

Для сегментов, расширяющихся вверх, логический адрес может принимать любое значение от 0 до LIMIT. Для сегментов, расширяющихся вниз (стековые сегменты), смысл поля LIMIT переворачивается, т.е. логический адрес может принимать любые значения кроме значений от 0 до LIMIT.

Для дескрипторов Intel286 определены только младшие 16 бит этого поля, а размер сегмента всегда задается только в байтах.

 

OFFSET (Смещение: Intel286 …)

Смещение точки входа в целевом сегменте.

 

P (Присутствие: Intel286 …)

Бит присутствия сегмента в физической памяти. Если этот бит не установлен, процессор генерирует особую ситуацию #NP (Сегмент не присутствует), когда селектор дескриптора загружается в сегментный регистр.

 

R (Разрешение чтения: Intel286 …)

Бит R разрешает/запрещает чтение из кодового сегмента. Когда чтение запрещено программы могут передавать управление в сегмент (т.е. он остается исполняемым), но чтение кода как данных из сегмента невозможно.

  • R = 1 — чтение возможно;
  • R = 0 — чтение запрещено.

 

S (Системный, бит 12 старшего двойного слова дескриптора: Intel286 …)

Задает вид дескриптора. Если S = 0, то дескриптор считается системным. Если S=1, то это дескриптор сегмента кода или данных. Системные дескрипторы выполняют важнейшие функции по управлению прерываниями, вызовами подпрограмм, переключениями задач. Тип системного дескриптора задается полем TYPE.

 

SELECTOR (Селектор: Intel286 …)

Селектор целевого сегмента или (для шлюза задачи) селектор TSS целевой задачи.

 

TYPE (Тип, биты 11..8 старшего двойного слова дескриптора: Intel286 …)

Поле тип содержит биты, которые задают назначение (тип) системного дескриптора.

TYPE Описание
---------------------------------- Intel286 …
0000 Зарезервировано
0001 Свободный 16-битный TSS
0010 Локальная таблица дескрипторов (LDT)
0011 Занятый 16-битный TSS
0100 16-битный шлюз вызова
0101 Шлюз задачи
0110 16-битный шлюз прерывания
0111 16-битный шлюз ловушки
-------------------------------------------- Intel386 …
1000 Зарезервировано
1001 Свободный 32-битный TSS
1010 Зарезервировано
1011 Занятый 32-битный TSS
1100 32-битный шлюз вызова
1101 Зарезервировано
1110 32-битный шлюз прерывания
1111 32-битный шлюз ловушки

 

W (Разрешение записи: Intel286 …)

Бит разрешения/запрещения записи в сегмент данных.

  • W = 1 — запись возможна;
  • W = 0 — запись запрещена.