stringtranslate.com

Описатель сегмента

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

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

Структура

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

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

Базовый адрес
Начальный адрес памяти сегмента. Его длина составляет 32 бита, и он создается из младших битов с 16 по 31 и старших битов с 0 по 7, за которыми следуют биты с 24 по 31.
Предел сегмента
Его длина составляет 20 бит, и он создается из младших битов 0–15 и старших битов 16–19. Он определяет адрес последних доступных данных. Длина на единицу больше значения, хранящегося здесь. То, как именно это следует интерпретировать, зависит от бита гранулярности дескриптора сегмента.
G=Зернистость
Если сброшено, ограничение в единицах байт, максимум 2 20 байт. Если установлено, ограничение в единицах страниц по 4096 байт, максимум 2 32 байта.
Д/Б
D = Размер операнда по умолчанию: если сброшен, это 16-битный сегмент кода; если установлен, это 32-битный сегмент.
B = Большой: Если установлено, максимальный размер смещения для сегмента данных увеличивается до 32-битного 0xffffffff. В противном случае это 16-битный максимум 0x0000ffff. По сути то же самое значение, что и "D".
Д=длинный
Если установлено, это 64-битный сегмент (и D должен быть равен нулю), и код в этом сегменте использует 64-битную кодировку инструкций. «L» не может быть установлено одновременно с «D», то есть «B». (Бит 21 на изображении)
AVL=Доступно
Для программного использования, не используется аппаратно (бит 20 на изображении с меткой A)
P=Присутствует
Если этот параметр очищен, при любой ссылке на этот сегмент генерируется исключение «сегмент отсутствует».
DPL=Уровень привилегий дескриптора
Уровень привилегий (кольцо), необходимый для доступа к этому дескриптору
S=Системный сегмент
Если очищено, это системный сегмент, если 1, это сегмент кода/данных.
Тип
Если бит 11 установлен, это дескриптор сегмента кода. Если очищен, это дескриптор сегмента данных/стека, в котором "D" заменено на "B", "C" заменено на "E" и "R" заменено на "W". Это фактически особый случай поля типа 2 бита, где предыдущий бит 12, очищенный как "0", относится к более внутренним системным дескрипторам для LDT, LSS и вентилей.
C=Соответствует
Код в этом сегменте может быть вызван с менее привилегированных уровней.
E=Расширить вниз
Если сброшен, сегмент расширяется от базового адреса до base+limit. Если установлен, он расширяется от максимального смещения вниз до limit, поведение, которое обычно используется для стеков.
R=Читаемый
Если флаг очищен, сегмент может быть выполнен, но не может быть прочитан.
W=доступно для записи
Если флаг очищен, сегмент данных можно читать, но нельзя записывать.
A=Доступно
Этот бит устанавливается в 1 аппаратно при доступе к сегменту и очищается программно.

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

Ссылки

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

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

Внешние ссылки