Сегментный селектор в IA-32 - PullRequest
       28

Сегментный селектор в IA-32

7 голосов
/ 02 февраля 2012

Когда селектор сегмента появляется на картинке. Строка в Руководстве Intel гласит:

"Каждый дескриптор сегмента имеет связанный селектор сегмента. Сегмент Селектор предоставляет программное обеспечение, которое использует его с индексом в GDT или LDT (смещение дескриптора соответствующего сегмента), глобальный / локальный флаг (определяет, указывает ли селектор на GDT или LDT) и информацию о правах доступа. "

Я не совсем понял.

Существуют ли отдельные регистры селектора сегментов? Как рассчитывается? Зачем нам это нужно .?

Ответы [ 3 ]

14 голосов
/ 03 июля 2015

GDT означает Таблица глобальных дескрипторов .
Здесь важно слово таблица , а под таблицей Intel подразумевается массив.

Будучи таблицей массивом, в котором есть элементы, каждый элемент называется Дескриптор . Конечно, каждый элемент может быть проиндексирован, то есть он имеет уникальный индекс

Сегменты селектора содержат индекс дескриптора. Значение в регистре селектора сегмента называется селектор .

Однако все немного сложнее.
index не является a селектором .

Помимо index , регистр селектора сегмента, содержит еще две вещи:

  1. Привилегия, которую программист хочет использовать для доступа к дескриптору . Это называется RPL (уровень привилегий запроса) для каждого регистра, но CS, в котором он называется CPL (текущий уровень привилегий). Роль RPL и CPL в использовании регистра селектора сегмента определена в руководствах Intel, и ее здесь слишком долго объяснять.

  2. Таблица для изучения. Одна таблица - 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 для получения дополнительной информации) и потому что сегменты теперь включают больше информация, чем просто базовое смещение и предел. Один из них: Уровень привилегий дескриптора , который ограничивает привилегии программы в пользовательском режиме.

1 голос
/ 07 февраля 2012

Итак, что происходит:

Всякий раз, когда программа загружается, загрузчик связей загружает «регистры сегментов» с соответствующими селекторами.
Сегментный регистр (например, CS, DS, SS и т. Д.) Разделен на две части: видимая и скрытая.
Это видимая часть, которая загружается загрузчиком с соответствующим значением.
Это значение является индексом в GDT или LDT, в зависимости от флага TI селектора.
Процессор загружает скрытую часть самостоятельно.Информация в скрытой части - это базовый адрес сегмента в линейном адресном пространстве, предел сегмента, информация о доступе.

1 голос
/ 02 февраля 2012

В реальном режиме доступ к памяти сегментирован, то есть к ней можно обратиться, указав местоположение сегмента и смещение сегмента.Затем физический адрес вычисляется путем добавления смещения к положению сегмента со сдвигом влево.И сегмент расположения сегмента, и смещение сегмента составляли 16 битов.

Из-за конструктивных решений Intel, которые, по-видимому, были очень сильно сфокусированы на обратной совместимости, они решили сохранить 16-битный размер регистров сегмента.Это вызвало проблемы, когда защищенный режим вошел в картину.В защищенном режиме GDT (глобальная таблица дескрипторов) и LDT (локальная таблица дескрипторов) хранятся где-то в памяти.Эти дескрипторы имеют все необходимые данные о сегментах, с которыми работает процессор.Чтобы получить доступ к этим дескрипторам, вам нужен селектор сегмента, который по сути является индексом в массиве дескрипторов сегмента (т. Е. LDT или GDT).

По существу, указав 5 в качестве значения селектора сегмента, вызывающегопроцессор использует 5-й (индексирование начинается с нуля) дескриптора в таблице локальных / глобальных дескрипторов.

...