Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Процессор INTEL в защищенном режиме


Информационный Канал Subscribe.Ru


ПРОЦЕССОР INTEL В ЗАЩИЩЕННОМ РЕЖИМЕ

ПРОЦЕССОР INTEL В ЗАЩИЩЕННОМ РЕЖИМЕ

 

 

Спецвыпуск

 

 

 

О влиянии флага G на человеческие умы.

 

90% всех Ваших вопросов так или иначе связаны с влиянием бита G на лимит, что и побудило меня к созданию данного спецвыпуска. Этот выпуск призван расставить все точки над «i» и рассеять туман вокруг таких понятий, как поле дескриптора «Лимит», реальный лимит сегмента и бит G.

 

Итак, по порядку. Поле дескриптора «Лимит» представляет собой 20-ти битное значение (см. картинку из 2 выпуска). Следовательно, максимальное значение, которое может хранить данное поле – FFFFFh (это 1 Мб). Т.е. выходит, что максимально возможный размер описуемого сегмента – 1 Мб. Но что же делать, если нам нужен сегмент, скажем, размером в 100 Мб ??? 100 Мб – это 6400000h! Для хранения такого огромного числа нам потребуется минимум 28 бит! (посчитайте сами). Что же делать?!

 

Вот тут на арену величаво выходит бит G. Стоит нам установить его в единицу – и тут же всё содержимое поля «Лимит» в дескрипторе будет воспринято процессором, как в 1000h раз большее, чем оно есть на самом деле! Т.е. для описания сегмента размером 6400000h нам достаточно положить туда (в поле «Лимит» дескриптора) число 6400h!!! Больше ни о чем заботиться не надо! Процессор смотрит на бит G=1 и уже знает, что на самом деле – описуемый сегмент в 1000h раз больше…

 

Вот мы подошли к следующему важному понятию. Реальный лимит сегмента. Реальный лимит сегмента – это фактически адрес ПОСЛЕДНЕГО БАЙТА ДАННОГО СЕГМЕНТА. Следующий за ним байт – уже не принадлежит данному сегменту и, грубо говоря, - вне его компетенции.

 

- «Но зачем вводить еще и это дополнительное понятие? Ведь есть поле «Лимит» в дескрипторе, его значение – и есть адрес последнего байта в сегменте! Зачем еще что то выдумывать?» - спрашиваете вы.

 

На самом деле, значение поля «Лимит» в дескриптор НЕ ЕСТЬ адрес последнего байта сегмента!!! Адрес последнего байта сегмента высчитывается следующим образом:

 

Если бит G сброшен (=0), то

Адрес последнего байта сегмента = Значение поля «Лимит» дескриптора * 1 + 1

 

 

Если бит G установлен (=1), то

Адрес последнего байта сегмента = Значение поля «Лимит» дескриптора * 1000h + 1000h

 

И только так!

 

Следующие – последние два понятия: поле «Лимит» регистра GDTR (LDTR) и реальный лимит таблицы дескрипторов. ЗДЕСЬ ВСЕ ТОЧНО ТАК ЖЕ, КАК И В СЛУЧАЕ С ЛИМИТОМ СЕГМЕНТА, за исключением того, что ФЛАГ G НИКАКИМ БОКОМ НИ НА ОДНО ИЗ ЭТИХ ДВУХ ПОНЯТИЙ УЖЕ НЕ ВЛИЯЕТ! Т.е. адрес последнего байта таблицы GDT ВСЕГДА (!) = значение поля «Лимит» регистра GDTR (LDTR) + 1.

 

 

И, наконец, вот вам несколько примеров на все случаи жизни, которые вызваны окончательно развеять все смутные сомненья…  

 

 

 

 

При бите G=0:

 

Поле «Лимит» дескриптора = ABCDh

Адрес последнего байта сегмента = ABCEh

 

Поле «Лимит» дескриптора = 1

Адрес последнего байта сегмента = 2

 

Поле «Лимит» дескриптора = 18h

Адрес последнего байта сегмента = 19h

 

Поле «Лимит» дескриптора = 0

Адрес последнего байта сегмента = 1

 

Поле «Лимит» регистра GDTR (LDTR) = 8

Адрес последнего байта таблицы дескрипторов = 9

 

Поле «Лимит» регистра GDTR (LDTR) = FFFh

Адрес последнего байта таблицы дескрипторов = 1000h

 

 

 

 

При бите G=1:

 

Поле «Лимит» дескриптора = ABCDh

Адрес последнего байта сегмента = ABCE000h

 

Поле «Лимит» дескриптора = 1

Адрес последнего байта сегмента = 2000h

 

Поле «Лимит» дескриптора = 18h

Адрес последнего байта сегмента = 19000h

 

Поле «Лимит» дескриптора = 0

Адрес последнего байта сегмента = 1000h

 

Поле «Лимит» регистра GDTR (LDTR) = 8

Адрес последнего байта таблицы дескрипторов = 9

 

Поле «Лимит» регистра GDTR (LDTR) = FFFh

Адрес последнего байта таблицы дескрипторов = 1000h

 

 

 

 

p.s. на всякий случай повторю еще раз: БОЛЬШЕ НИ НА ЧТО ФЛАГ G НЕ ВЛИЯЕТ !!!

 

p.p.s. а конкурс то в самом разгаре! Пока, кроме Stanislav-а, никто ничем не порадовал… Вопреки ожиданиям и прогнозам, ошибку почему то вообще никто в упор не видит.

 

brokensword@mail.ru


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

В избранное