GDT означает Таблица глобальных дескрипторов .
Здесь важно слово таблица , а под таблицей Intel подразумевается массив.
Будучи таблицей массивом, в котором есть элементы, каждый элемент называется Дескриптор . Конечно, каждый элемент может быть проиндексирован, то есть он имеет уникальный индекс
Сегменты селектора содержат индекс дескриптора. Значение в регистре селектора сегмента называется селектор .
Однако все немного сложнее.
index не является a селектором .
Помимо index , регистр селектора сегмента, содержит еще две вещи:
Привилегия, которую программист хочет использовать для доступа к дескриптору . Это называется RPL (уровень привилегий запроса) для каждого регистра, но CS
, в котором он называется CPL (текущий уровень привилегий). Роль RPL и CPL в использовании регистра селектора сегмента определена в руководствах Intel, и ее здесь слишком долго объяснять.
Таблица для изучения. Одна таблица - GDT , другая - LDT . Снова различия и использование в руководствах Intel.
Итак, неофициальное правило:
селектор = индекс + table_to_use + привилегия
table_to_use + index = дескриптор = вся информация об используемом сегменте памяти
где, конечно, +
вовсе не означает арифметический плюс. Фактическое битовое поле для регистра селектора сегмента составляет
15 3 2 0
+--------------------------------------------------+----+--------+
| Index | TI | RPL |
+--------------------------------------------------+----+--------+
TI = Table Indicator: 0 = GDT, 1 = LDT
Так, например, значение 05h
выберите дескриптор с индексом 0 (в LDT с использованием RPL = 1), что недопустимо, поскольку Intel явно обязуется не использовать дескриптор 0.
Первый используемый дескриптор доступен с помощью селектора 08h
, который выбирает в качестве таблицы GDT с RPL = 0. Все значения 08h-0bh
выбирают дескриптор с индексом 1 в GDT , просто с разными RPL .
Вот полное ASCII искусство терминологии
<---- Selector ----> +----- Segment Selector Register
+-------+----+-----+ v
| Index | TI | RPL | = DS
+-------+----+-----+ GDT LDT
| | +---------------------+ +---------------------+
| +------------>| Null Descriptor | | Null Descriptor |
| +---------------------+ +---------------------+
| | Descriptor 1 | | Descriptor 1 |
| +---------------------+ +---------------------+
| | | | |
| ... ... ... ... ... ... ... ...
| | |
| +---------------------+
+------------------->| Descriptor K |
+---------------------+
| |
... ... ... ...
О том, как он рассчитывается и зачем он нам нужен
Краткий ответ : Прочтите руководство Intel, поскольку оно является полным справочником.
Длинный ответ : Мы, программисты пользовательского режима, не рассчитываем это. Так как все это с сегментами сводится к ограничению привилегий программы, и поскольку именно ОС командует, а не мы, мы просто используем значение, которое ОС дает нам (загружая нашу программу в основном), как GDT и LDT созданы ОС, и теперь она готова сотрудничать с нами в любом ее аспекте.
Нам нужны сегменты, потому что в Реальном режиме были сегменты (Google для получения дополнительной информации), потому что они могут избежать перемещения изоляции группы при отсутствии подкачки страниц (Google для получения дополнительной информации) и потому что сегменты теперь включают больше информация, чем просто базовое смещение и предел. Один из них: Уровень привилегий дескриптора , который ограничивает привилегии программы в пользовательском режиме.