Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Защищенный режим.doc
Скачиваний:
3
Добавлен:
15.11.2019
Размер:
412.16 Кб
Скачать

Процессор Intel в защищенном режиме #4

FAQ:

- Непонятно высказывание из выпуска №2: «…если G=1 и поле «Лимит сегмента» = 0000Fh (15 байт), то реальный лимит (читай – размер) данного сегмента равен 0Fh*1000h=0F000h (около 61 тысячи байт!)». Ты же сам говорил, что «реальный» лимит сегмента (его размер) при G=1 на 4Кб больше (а при G=0 - на один байт) (т.е. к 0F000h нужно еще прибавить 1000h, ведь так??!!!)

Абсолютно верно. Ситуация такова: чтобы найти адрес последнего байта сегмента (его лимит), нам нужно в зависимости от бита G к соответствующему значению поля дескриптора (то самое, красного цвета) ПРИБАВИТЬ 1 или 1000h. Просто я об этом говорю чуть дальше по тексту. Т.е. если поле «Лимит» дескриптора содержит число 12345h, а бит G=1, то значит лимит равен 12345h*1000h + 1000h.

Теперь, если поле «Лимит» дескриптора равно 12345h, а бит G=0, то лимит будет равен 12345h*1 + 1.

Вывод, который нужно сделать из всего вышесказанного:

Значение поля дескриптора «Лимит» и РЕАЛЬНЫЙ лимит сегмента – это разные величины (которые при любом раскладе, отличаются друг от друга на 1 либо на 1000h, в зависимости от флага G)

- «Лимит таблицы – 16-битное значение, показывает величину таблицы в байтах + 1 (т.е. все как и в случае с лимитом сегмента: если лимит таблицы в GDTR равен 0, то на самом деле это означает что реально (в памяти) лимит равен одному байту). А далее по тексту: следовательно, лимит таблицы дескрипторов – величина, равная 8N-1 байт. Так минус один или плюс, определись уже.

Вот по данному вопросу хочу публично извинится, на самом деле, конечно же, «показывает величину таблицы в байтах – 1» (в том контексте, в котором я сказал). Просто я имел ввиду, что надо «прибавить» единицу и мы получим РЕАЛЬНОЕ значение лимита :). Извиняюсь. В таких «туманных» вопросах надо быть особо внимательным.

Еще раз: лимит таблицы дескрипторов (РЕАЛЬНЫЙ) ВСЕГДА (!) на единицу больше, чем соответствующее поле регистра GDTR (LDTR). От флага гранулярности G РЕАЛЬНЫЙ лимит НЕ ЗАВИСИТ, поэтому всегда больше ТОЛЬКО НА ЕДИНИЦУ.

ВНИМАНИЕ! ПРЕДВАРИТЕЛЬНЫЕ РЕЗУЛЬТАТЫ КОНКУРСА!

Рассмотрим в подробностях поля дескриптора, которые были помечены «хрестиками».

ВСЕ, О ЧЕМ ПОЙДЕТ РЕЧЬ НИЖЕ, СПРАВЕДЛИВО ТОЛЬКО ПРИ S=1!!! (S - 12 бит во втором двойном слове, т.е. при таком раскладе дескриптор описывает либо данные, либо код).

11 бит во втором двойном слове (он же четвертый бит поля «Тип») показывает, является описуемый сегмент кодом или данными (0 – данные, 1 – код)

Если это сегмент данных, то младшие три бита поля «Тип» (10-8) интерпретируются как бит E (expansion-direction) – рост направления, бит W (write-enable) – запись разрешена и бит A (accessed) – доступен. Я умышлено привожу английские интерпретации, чтобы знатоки языка сами сделали надлежащие выводы без моих «вольных переводов».

Посмотрите мимолетно на табличку, и все станет понятно:

И вот здесь вас подстерегает один приятный сюрприз: оказывается, нет такого специального типа сегмента, как сегмент стека. Сегмент стека – это ни что иное, как сегмент данных, растущий вниз!!! Не правда ли, вы в шоке? :) Сегмент стека ОБЯЗАТЕЛЬНО должен быть доступен для чтения/записи! Т.е. мы должны учесть это при описании сегмента стека.

ДЛЯ сегмента кода младшие три бита поля «Тип» интерпретируются, как C (conforming) – подчиненный, R (read enable) – чтение разрешено и A (accessed) – доступен. Как видите, сегмент кода может быть доступен как только для исполнения, так и для исполнения/чтения. Для исполнения/чтения он может быть доступен в том случае, когда мы храним какие-либо константы или другие статические данные в памяти, непосредственно в сегменте кода. Ну это и так понятно. А теперь ВНИМАНИЕ! В ЗАЩИЩЕННОМ РЕЖИМЕ В СЕГМЕНТ КОДА ПИСАТЬ НЕЛЬЗЯ! Если ты заметил, даже нет такого битика, чтоб никто и не пытался…

Что это за загадочный бит C (conforming)? Этот относится к уровням привилегий и пока не будем его трогать вообще. А что это за подозрительный бит A (accessed)? Что значит «доступен» или не доступен? А об этом мы поговорим в СЛЕДУЮЩЕМ, очень важном выпуске…

ТЕПЕРЬ, ЕСЛИ S=0 (описуемый сегмент является системным сегментом):

Процессор различает 6 типов системных дескрипторов:

  • Дескриптор сегмента «таблица LDT»

  • Дескриптор сегмента «состояние задачи» (TSS, о нем позже)

  • Дескриптор шлюза вызова (Call-Gate) – как зубная паста :)

  • Дескриптор шлюза прерывания (Interrupt-Gate)

  • Дескриптор шлюза ловушки (Trap-Gate)

  • Дескриптор шлюза задачи (Task-Gate)

В свою очередь, данные 6 дескрипторов делятся на две группы: дескрипторы системных сегментов (первые два) и дескрипторы шлюзов (все остальные).

Самый первый (дескриптор сегмента «таблица LDT») нам уже хорошо знаком, а вот с остальными мы еще не скоро познакомимся… Вообщем, смотри на таблицу: