Информационный Канал Subscribe.Ru Rax - такой статистики нет ни у кого другого

ПРОЦЕССОР 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 РЕАЛЬНЫЙ лимит НЕ ЗАВИСИТ, поэтому всегда больше ТОЛЬКО НА ЕДИНИЦУ.

 

 

 

 

 

 

 

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

 

Ответы прислали уже два человека, с чем их можно и поздравить. Правда, ни один из не получит ключей от квартиры, потому как не все ответы совпадают с реальными… :). В частности, почему то оба участника решили, что ошибка кроется в 5 дескрипторе (вероятно, сбили с толку нули), но на это и рассчитано! :) На самом деле, лимит МОЖЕТ равняться нулю (в таком случае сегмент займет в памяти ОДИН байт, ничего недопустимого здесь нет); еще многие совершенно забыли про существование бита G и принимали лимит во всей его ложной личине :) Еще почему то напрочь забыли про старшие биты поля «база» и «лимит» и вообще не обращали на них никакого внимания. Но времени – предостаточно! Думайте! :)

Многим из вас безумно лень копаться в битиках и высчитывать, но без этого - ни шагу вперед! После того, как каждый хотя бы попытается это сделать – сами поймете, насколько все будет легче дальше…

 

 

Этот 4 выпуск будет совсем коротеньким и нести в себе чисто справочную информацию. В отличии от предыдущего шевелить извилинами не придется вообще… После этого, 4 выпуска, будет недельное затишье, пусть те кто подписался с 2-3 выпуска догонят остальных (двух человек :) и переварят все 4 выпуска, и мы подведем окончательные итоги конкурса! Убедительная просьба к конкурсантам: БУДЬТЕ ВНИМАТЕЛЬНЫ!

 

 

 

 

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

 

ВСЕ, О ЧЕМ ПОЙДЕТ РЕЧЬ НИЖЕ, СПРАВЕДЛИВО ТОЛЬКО ПРИ S=1!!!

(S - 12 бит во втором двойном слове, т.е. при таком раскладе дескриптор описывает либо данные, либо код).

 

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

 

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

 

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

 

Поле Тип

Тип

дескриптора

Описание

11

10

E

9

W

8

A

0

1

2

3

4

5

6

7

0

0

0

0

0

0

0

0

0

0

0

0

1

1

1

1

0

0

1

1

0

0

1

1

0

1

0

1

0

1

0

1

Данные

Данные

Данные

Данные

Данные

Данные

Данные

Данные

Только для чтения

Только для чтения, доступен

Для чтения/записи

Для чтения/записи, доступен

Только для чтения, растет вниз

Только для чтения, растет вниз, доступен

Для чтения/записи, растет вниз

Для чтения/записи, растет вниз, доступен

 

 

C

R

A

 

 

8

9

10

11

12

13

14

15

1

1

1

1

1

1

1

1

0

0

0

0

1

1

1

1

0

0

1

1

0

0

1

1

0

1

0

1

0

1

0

1

Код

Код

Код

Код

Код

Код

Код

Код

Только для исполнения

Только для исполнения, доступен

Для исполнения/чтения

Для исполнения/чтения, доступен

Только для исполнения, подчинен

Только для исполнения, подчинен, доступен

Для исполнения/чтения, подчинен

Для исполнения/чтения, подчинен, доступен

 

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

 

ДЛЯ сегмента кода младшие три бита поля «Тип» интерпретируются, как 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») нам уже хорошо знаком, а вот с остальными мы еще не скоро познакомимся…

Вообщем, смотри на таблицу:

 

Поле «Тип»

Описание

11

10

9

8

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

0

0

0

0

0

0

0

0

1

1

1

1

1

1

1

1

0

0

0

0

1

1

1

1

0

0

0

0

1

1

1

1

0

0

1

1

0

0

1

1

0

0

1

1

0

0

1

1

0

1

0

1

0

1

0

1

0

1

0

1

0

1

0

1

Зарезервировано

16-битный TSS (свободен)

LDT

16-битный TSS (занят)

16-битный шлюз вызова

Шлюз задачи

16-битный шлюз прерывания

16-битный шлюз ловушки

Зарезервировано

32-битный TSS (свободен)

Зарезервировано

32-битный TSS (занят)

32-битный шлюз вызова

Зарезервировано

32-битный шлюз прерывания

32-битный шлюз ловушки

 

 

Вот вы наверно думаете, что это за беспредел такой – чуть что то неизвестное и непонятное – так сразу «с этим мы познакомимся попозже».

 

Нет, я конечно могу рассказать про дескрипторы шлюзов поподробнее прямо сейчас, просто для понимания это окажет обратный эффект… Остановимся на них попозже, и так мне кажется, информации в четырех выпусках предостаточно! Было бы неплохо бегло перечитать их всех еще раз, с первого. Просто посмотри на все совершенно другими глазами.

 

Ну все, прощаюсь на неделю (а может и на две)! Больше не буду доставать своими дескрипторами. Служба ответов на ваши вопросы (brokensword@ukr.net) работает круглосуточно.

 

Ариведерчи (Z)


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

Hosted by uCoz