Что именно меняет бит детализации GDT в отношении адресации памяти?

Если этот бит равен нулю, то память адресуется байт за байтом? А если 1, то память адресуется 4Кб на 4Кб?

Так, например, если этот бит был установлен в 0, и я адресовал ячейку памяти a000h, тогда я бы адресовал байт в этой ячейке, верно? И если бы я обратился к следующему местоположению a001h, то это был бы следующий байт в памяти, верно?

Но если этот бит равен 1, буду ли я адресовать фрагменты размером 4 КБ?

Таким образом, адресация a000h даст мне кусок размером 4 КБ, а a001 — следующие 4 КБ в памяти?


person kbzombie    schedule 26.10.2014    source источник
comment
Флаг определяет, как интерпретируется поле Limit, как описано здесь.   -  person 500 - Internal Server Error    schedule 27.10.2014


Ответы (2)


Ответ kbzombie почти правильный. Различные ресурсы в Интернете на самом деле совершают одну и ту же ошибку, вероятно, потому, что один копирует другой.

Когда установлен бит детализации, предел действительно сдвигается влево на 12 бит, но важно отметить, что вставляются однобитные. Таким образом, 0xfffff приводит к ограничению 0xffffffff, а 0x00000 приводит к ограничению 0x00000fff.

В Справочном руководстве программиста 80386 говорится следующее:

6.3.1.2 ПРОВЕРКА ОГРАНИЧЕНИЙ

Поле предела дескриптора сегмента используется процессором для предотвращения адресации программ вне сегмента. Интерпретация предела процессором зависит от установки бита G (детализация). Для сегментов данных интерпретация предела процессором зависит также от Е-бита (бит направления расширения) и В-бита (старший бит) (см. Таблицу 6-2).

Когда G=0, фактическим пределом является значение 20-битного поля предела, как оно появляется в дескрипторе. При этом предел может быть от 0 до 0FFFFFH (220 — 1 или 1 мегабайт). Когда G=1, процессор добавляет 12 младших битов к значению в поле предела. В этом случае фактическое ограничение может варьироваться от 0FFFH (212 – 1 или 4 килобайта) до 0FFFFFFFFH (232 – 1 или 4 гигабайта).

Таблица 6-2

person user247702    schedule 20.09.2017
comment
На самом деле все еще проще: как следует из названия, детализация просто выбирает единицу измерения в поле limit. G = 0: использовать байты. G = 1: используйте 4 КБ. Остальные (сдвиг, расширение вниз, минимальный размер) либо не зависят от детализации, либо просто от деталей реализации. - person Margaret Bloom; 21.09.2017
comment
@MargaretBloom Я обнаружил, что описание использования 4 КБ немного сбивает с толку, поскольку оно подразумевает, что предел 0x00000 на самом деле означает 0. Разве реализация сдвига не является важной деталью? По общему признанию, мне все еще нужно достичь точки, где я реализую пейджинг, поэтому у меня ограниченный взгляд на вещи. - person user247702; 21.09.2017
comment
Да, ты прав. Это лучше рассматривать как сдвиг, хотя в современной версии руководства говорится, что младшие 12 бит не проверяются. Удивительно, как Intel может делать запутанные заявления по такой простой теме! - person Margaret Bloom; 21.09.2017
comment
@Stijn, ограничение 0x00000 (с G = 1) означает, что самой высокой страницей размером 4 КБ, которая находится в пределах ограничения сегмента, является страница 0. - person prl; 21.09.2017

Если бит детализации не установлен, предел используется как есть. Таким образом, с ограничением 0xffffff и основанием 0 вы можете адресовать 0xffffff или 1048575 байт. Но если бит установлен, то ограничение в 20 бит сдвигается влево на 12 бит. Таким образом, для того же предела 0xffffff и базы 0 фактический предел будет 0xffffff000 или 4294963200 в десятичном виде, что дает вам полные 4 ГБ адресных возможностей.

person kbzombie    schedule 03.04.2015