32-битный предел памяти для сегментированной сборки - PullRequest
4 голосов
/ 28 октября 2010

Если 32-разрядная операционная система, работающая с моделью сегментированной памяти, будет ли она по-прежнему иметь ограничение 4 ГБ ?

Я читал Руководство разработчика по семейству процессоров Intel Pentium , в котором говорится, что при использовании модели с сегментированной памятью возможно отображение до 64 ТБ памяти.

В сегментированной модели памяти организация, логический адрес пространство состоит из целых 16 383 сегменты до 4 гигабайт каждый, или в общей сложности 2 ^ 46 байт (64 терабайт). Процессор отображает это 64 терабайтное логическое адресное пространство на физическое адресное пространство механизм трансляции адресов описано в главе 11. Применение программисты могут игнорировать детали это отображение. Преимущество Сегментированная модель состоит в том, что смещения в пределах каждое адресное пространство отдельно проверил и доступ к каждому сегмент может быть индивидуально под контролем.

alt text

Это не сложный вопрос. Я просто хочу убедиться, что я правильно понял текст. Если бы Windows или любая другая ОС работали в сегментированной модели, а не в плоской модели, было бы ограничение памяти 64 ТБ?


Обновление:

alt text

Системная документация Intel 3-2 3a.


alt text

http://pdos.csail.mit.edu/6.828/2005/readings/i386/c05.htm


Сегментный регистр НЕ должен рассматриваться как обычный смысл в реальном режиме. Сегментный регистр действует как SELECTOR для таблицы глобальных дескрипторов.

В защищенном режиме вы используете логический адрес в форме A: B для адресации памяти. Как и в реальном режиме, A является частью сегмента, а B является смещением в этом сегменте. Регистры в> защищенном режиме ограничены 32 битами. 32 бита могут представлять любое целое число от 0 до 4 Гб. Поскольку B может принимать любое значение от 0 до 4 ГБ, наши сегменты теперь имеют максимальный размер 4 ГБ (то же самое, что и в реальном режиме). Теперь о разнице. В защищенном режиме А не является абсолютным значением для сегмента. В защищенном режиме А является селектором. Селектор представляет смещение в системной таблице, называемой Глобальной таблицей дескрипторов (GDT). GDT содержит список дескрипторов. Каждый из этих дескрипторов содержит информацию, которая описывает характеристики сегмента.

Сегментный селектор обеспечивает дополнительную безопасность, которую невозможно достичь с помощью подкачки.

Оба эти метода [Сегментация и пейджинг] имеют свои преимущества, но пейджинг гораздо лучше. Сегментация, хотя и остается пригодной для использования, быстро устареет как метод защиты памяти и виртуальной памяти. Фактически, для архитектуры x86-64 требуется плоская модель памяти (один сегмент с основанием 0 и пределом 0xFFFFFFFF) для правильной работы некоторых инструкций.

Однако сегментация полностью встроена в архитектуру x86. Это невозможно обойти. Итак, здесь мы покажем вам, как настроить собственную таблицу глобальных дескрипторов - список дескрипторов сегментов.

Как упоминалось ранее, мы собираемся попытаться настроить модель с плоской памятью. Окно сегмента должно начинаться с 0x00000000 и расширяться до 0xFFFFFFFF (конец памяти). Однако есть одна вещь, которую сегментирование может сделать, что подкачка не может, и это установить уровень вызова.

http://www.jamesmolloy.co.uk/tutorial_html/4.-The%20GDT%20and%20IDT.html

Например, в GDT перечислены различные пользователи, их уровни доступа и области доступа к памяти:

Образец таблицы GDT

GDT[0] = {.base=0, .limit=0, .type=0};             
// Selector 0x00 cannot be used
GDT[1] = {.base=0, .limit=0xffffffff, .type=0x9A}; 
// Selector 0x08 will be our code
GDT[2] = {.base=0, .limit=0xffffffff, .type=0x92}; 
// Selector 0x10 will be our data
GDT[3] = {.base=&myTss, .limit=sizeof(myTss), .type=0x89}; 
// You can use LTR(0x18)

http://wiki.osdev.org/GDT_Tutorial#What_should_i_put_in_my_GDT.3F

Пейджинговая часть - это то, что отображается на физическую память. (PAE) обеспечивает дополнительную память объемом до 64 ГБ.

Итак, вкратце. Ответ: нет, вы не можете иметь более 4 ГБ логической памяти. Я считаю претензию на 64 ТБ опечаткой в ​​ Руководстве разработчика по семейству процессоров Intel Pentium .

Ответы [ 5 ]

2 голосов
/ 15 августа 2014

Заявка составляет 64 ТБ логического адресного пространства. Устранение ограничений физической памяти не имеет значения, потому что, включив подкачку памяти, можно обойти физические ограничения.

Тем не менее, это все еще немного вводящее в заблуждение утверждение, поскольку поле «Индекс» селектора сегмента составляет 16 битов, минус 1 бит для индикатора таблицы и 2 бита для уровня защиты запроса, оставляя в общей сложности 8 192 (13 бит) селектора сегментов , С 8 192 сегментами по 4 ГБ можно было получить доступ только к 32 ТБ логической памяти в GDT (таблица глобальных дескрипторов) или в LDT (таблица локальных дескрипторов). Чтобы получить доступ к 64 ТБ логической памяти, необходимо полностью использовать GDT и LDT с 16 384 уникальными сегментами.

Несмотря на это, первый вопрос был «есть ли предел в 4 ГБ», а ответ - «нет». В 32-разрядной системе с включенными сегментацией и пейджингом можно, например, выделить 512 МБ для сегмента кода (CS), 1 ГБ для сегмента стека (SS) и 4 ГБ для сегмента данных (DS).

Ответ на второй вопрос о том, будет ли ОС ограничена 64 ТБ, если она использует модель с сегментированной памятью, является менее прямым. Задача ОС - предоставить диспетчер памяти. Очевидно, будет физическое ограничение 32 ГБ ОЗУ. 32-битный Linux, поскольку он использует подкачку страниц, может предоставить каждому приложению 4 ГБ плоского адресного пространства (игнорируя данные разделения ядра / пользователя). И каждый процесс считает, что он имеет 4 ГБ физического адресного пространства.

Вкратце, я думаю, что вы путаете ограничения сегментации с ограничениями подкачки. Пейджинг позволяет системе или приложению использовать больше оперативной памяти, чем физически доступно. Сегментация позволяет отображать процесс в несколько 32-битных логически адресуемых сегментов. Его ключ к тому, чтобы отметить, что даже в плоском режиме используется сегментация, но все регистры сегментов отображаются на один и тот же базовый адрес.

2 голосов
/ 28 октября 2010

Вы помните старые времена? DOS на x86 в реальном режиме с сегментами 64 КБ? FAR указатели? НМА? XMS? По мере роста объема памяти они нашли способы использовать больше памяти, чем обычно мог обрабатывать процессор. Но это было некрасиво.

Конечно, они могут использовать сегментацию для 32 битов, но почему? Не было необходимости. Когда появились 32-битные процессоры, ограничение в 4 Гб было более чем достаточно, поэтому было принято решение использовать плоскую модель.

Кроме того, 32-битная ОС может использовать более 4 ГБ, этот процесс ограничен адресным пространством 4 ГБ (даже 2 или 3 в Windows).

2 голосов
/ 28 октября 2010

Редактировать: В моем ответе предполагается, что под "пределом 4 ГБ" вы имеете в виду максимальный размер линейного (виртуального) адресного пространства, а не физического адресного пространства.Как объясняется в комментариях ниже, последний фактически не ограничивается 4 ГБ вообще - даже при использовании модели с плоской памятью.


Повторение вашей цитаты с акцентом:

логическое адресное пространство состоит из 16 383 сегментов по 4 гигабайта в каждом

Теперь, цитата из тома Intel® 64 и IA-32 Architectures Software.1: Базовая архитектура »(PDF доступен здесь ):

Внутренне все сегменты, определенные для системы, отображаются в адрес процессора linear space.

Именно это linear адресное пространство (на 32-разрядном процессоре) ограничено 4 ГБ.Таким образом, модель сегментированной памяти все еще будет ограничена.

0 голосов
/ 28 октября 2010

Сегментированная модель Intel ограничена 16 384 сегментами.Это слишком мало, чтобы действительно было удобно.Что было бы намного приятнее, было бы, если бы система могла быстро переключаться между двумя или четырьмя миллиардами сегментов.Это то, что я хотел бы видеть, а не 64-битное линейное пространство.Конструкция, которая могла бы эффективно поместить каждый выделенный объект в отдельный сегмент, позволяла бы без дополнительной проверки диапазона служебных данных для каждого отдельного выделенного объекта перемещать объект с минимальным воздействием на выполняемый код (при условии, что ЦП мог заметить, когда выбранный в данный момент сегментаннулировано) и т. д., в то время как только ссылки на объекты занимают в кеше вдвое меньше места, чем 64-битный указатель.

0 голосов
/ 28 октября 2010

AFAIK, ответ «не обязательно» из-за других ограничений ОС. Они могут захотеть сохранить максимальный размер памяти намного ниже теоретического предела, потому что это может сделать некоторые из структур внутренней памяти меньшими и более производительными. Но я действительно не знаю ... Я не Марк Руссинович ...

Взгляните на PAE . Я думаю это то, о чем вы говорите, но так как я перешел на 64-битные указатели, я решил убить клетки мозга, которые имели дело с оконными моделями памяти, с помощью виски Kentucky Straight Bourbon.

...