Дескриптор сегмента - Википедия - Segment descriptor

Адресация в памяти для Intel x86 компьютерные архитектуры, дескрипторы сегментов являются частью модуля сегментации, используются для перевода логический адрес на линейный адрес. Дескрипторы сегмента описывают сегмент памяти упоминается в логическом адресе.[1]Дескриптор сегмента (8 байтов в 80286 и новее) содержит следующие поля:[2]

  1. Базовый адрес сегмента
  2. Ограничение сегмента, определяющее размер сегмента
  3. Байт прав доступа, содержащий информацию о механизме защиты
  4. Биты управления

Структура

Дескриптор сегмента x86 и x86-64 имеет следующий вид:[3]

31242322212019161514131211109870
Базовый адрес [31:24]граммD / BLAVLПредел сегмента [19:16]пDPL1ТипC / ER / WАБазовый адрес [23:16]
Базовый адрес [15: 0]Предел сегмента [15: 0]

Где обозначены поля:

Базовый адрес
32-битный начальный адрес памяти сегмента
Предел сегмента
Длина сегмента 20 бит. (Точнее, адрес последних доступных данных, поэтому длина на единицу больше, чем хранимое здесь значение.) Как именно это следует интерпретировать, зависит от других битов дескриптора сегмента.
G = Гранулярность
Если этот параметр не установлен, ограничение выражается в байтах, максимум 2.20 байтов. Если установлено, ограничение задается в единицах страниц по 4096 байт, максимум 232 байтов.
D = размер операнда по умолчанию
Если он не установлен, это 16-битный сегмент кода; если установлено, это 32-битный сегмент.
B = Большой
Если установлено, максимальный размер смещения для сегмента данных увеличивается до 32-битного значения 0xffffffff. В противном случае это 16-битный максимум 0x0000ffff. По сути то же самое, что и "D".
L = длинный
Если установлено, это 64-битный сегмент (и D должен быть равен нулю), и код в этом сегменте использует 64-битную кодировку инструкций. «L» не может быть установлено одновременно с «D» или «B».
AVL = доступно
Для использования программного обеспечения, не используется оборудованием
P = настоящее
Если этот параметр не установлен, при любой ссылке на этот сегмент создается исключение "сегмент отсутствует".
DPL = уровень привилегий дескриптора
Уровень привилегий (кольцо), необходимый для доступа к этому дескриптору
Тип
Если установлено, это дескриптор сегмента кода. Если он не установлен, это дескриптор сегмента данных / стека, в котором «D» заменено на «B», «C» заменено на «E» и «R» заменено на «W». Фактически это частный случай 2-битного поля типа, где предыдущий бит 12, очищенный как «0», относится к большему количеству внутренних системных дескрипторов для LDT, LSS и вентилей.
C = Соответствие
Код в этом сегменте можно вызывать с менее привилегированных уровней.
E = развернуть вниз
Если этот параметр не установлен, сегмент расширяется от базового адреса до предела base +. Если установлено, оно расширяется от максимального смещения до предела, что обычно используется для стеков.
R = читаемый
Если он очищен, сегмент может быть выполнен, но не прочитан.
W = возможность записи
Если он не установлен, сегмент данных может быть прочитан, но не записан.
A = Доступно
Этот бит устанавливается в 1 аппаратно при доступе к сегменту и сбрасывается программно.

Смотрите также

Рекомендации

  1. ^ Бовет, Д.П., и Чезати, М. (2000). Понимание ядра Linux (первое издание). O'Reilly & Associates, Inc.
  2. ^ Табак, Даниэль (1995). Продвинутые микропроцессоры. Издательство Mcgraw Hill. п.149. ISBN  9780070628434.
  3. ^ Руководство программиста по архитектуре AMD64 Том 2: Системное программирование (PDF) (Технический отчет). 2013. с. 80. Архивировано с оригинал (PDF) 18 февраля 2018 г.

дальнейшее чтение

внешняя ссылка