Предел памяти 32-битной сегментированной модели сборки

Если бы 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


Регистр сегмента НЕ следует рассматривать в традиционном смысле этого слова. Регистр сегмента действует как селектор для глобальной таблицы дескрипторов.

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


person Community    schedule 28.10.2010    source источник
comment
internals.com/articles/protmode/protmode.htm Эта ссылка помогла мне маленький.   -  person    schedule 28.10.2010
comment
Да, эта опечатка заставила меня 4 часа искать все бессмысленные вопросы, которые возникают из-за нее.   -  person Jay Patel    schedule 27.04.2021


Ответы (5)


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


Повторяю вашу цитату с акцентом:

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

Теперь процитируем "Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32, том 1: Базовая архитектура" (PDF-файл доступен здесь):

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

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

person user200783    schedule 28.10.2010
comment
Не совсем. Достаточно близко для джаза и недостаточно далеко, чтобы гарантировать -1, но более поздние расширения процессоров в линейке Pentium (например, PAE, PSE-36 и т.п.) фактически дают вам линейное адресное пространство, значительно превышающее 4 ГБ. Фактически, в 16 раз больше. Если бы операционная система использовала подходящие сегменты, отдельный процесс мог бы иметь доступ ко всему этому пространству (за вычетом того, что ядро ​​резервирует для себя, естественно). - person JUST MY correct OPINION; 28.10.2010
comment
PAE и PSE-36 увеличивают физическое адресное пространство сверх 4 ГБ, но линейные (виртуальные) адреса по-прежнему ограничены 32 битами. - person user200783; 28.10.2010
comment
Чтобы не согласиться, просто чтобы уточнить с точки зрения Windows: Microsoft Windows реализует PAE, если загружается с соответствующей опцией, но текущие 32-разрядные версии для настольных ПК обеспечивают физическое адресное пространство в пределах 4 ГБ даже в режиме PAE. По словам Джеффа Чаппелла, Microsoft ограничивает 32-разрядные версии Windows 4 ГБ из-за лицензионных ограничений, а технический сотрудник Microsoft Марк Руссинович говорит, что некоторые драйверы оказались нестабильными при обнаружении физических адресов размером более 4 ГБ. - Wiki on PAE - person ; 28.10.2010
comment
Поскольку многозадачные вычислительные системы обычно определяют линейное адресное пространство, намного большее, чем экономически целесообразно содержать все сразу в физической памяти, необходим некоторый метод «виртуализации» линейного адресного пространства. Эта виртуализация линейного адресного пространства осуществляется с помощью механизма подкачки страниц процессора. - Intel 3-2 Vol3A Стр. 94 Эта цитата, кажется, противоречит вашему утверждению о том, что линейное адресное пространство в 32-битном процессе ограничено 4 ГБ . Похоже, линейное адресное пространство больше, чем возможна память. - person ; 28.10.2010
comment
Миф: PAE увеличивает виртуальное адресное пространство сверх 4 ГБ: блоги .msdn.com / b / oldnewthing / archive / 2004/08/18 / 216492.aspx Я клянусь, что документация Intel может вводить в заблуждение. - person ; 29.10.2010

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

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

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

person ruslik    schedule 28.10.2010
comment
Ограничен ли процесс только тем, что это плоская модель? Что, если бы это была сегментированная модель? - person ; 28.10.2010
comment
@Shiftbit Не путайте диапазон адресов с прямым адресом с сегментированным доступом. Вы можете использовать WME для доступа к большему объему памяти, но вы все равно не сможете делать char* c = malloc(5*GB) и читать любое значение из if напрямую, без какой-либо оболочки. - person ruslik; 28.10.2010
comment
@Shiftbit - лучший пример. Как бы вы хотели запрограммировать процессор, который имеет 1M сегментов по 64 КБ? У него будет 64 ГБ адресного пространства. - person ruslik; 28.10.2010

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

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

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

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

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

person typedeaf    schedule 15.08.2014
comment
сегментация разрешена перед разбиением на страницы. При включенном разбиении по страницам базовый сегмент + смещение дает 32-битный линейный виртуальный адрес. т.е. базы сегментов являются виртуальными и не увеличивают объем памяти, который вы можете отобразить в любой момент времени. Чтобы получить доступ к более чем 4 ГБ физической ОЗУ, вам потребуется несколько потоков / процессов с отдельными виртуальными адресными пространствами или вам необходимо переназначить различные части физической ОЗУ в 32-разрядное виртуальное адресное пространство. Или, конечно, использовать длинный режим x86-64. - person Peter Cordes; 05.04.2018
comment
Я не уверен, что с отключенной подкачкой. Без пейджинга у вас не может быть PAE, но IDK, что произойдет, если вы установите ограничение сегмента = 4G / base = 3G (или чуть ниже 4G). Возможно, тогда вы могли бы получить доступ к некоторым частям физической памяти за пределами низкого 4G с 32-битным смещением от этого высокого базового адреса. А может и нет, если линейные адреса по-прежнему 32-битные. - person Peter Cordes; 05.04.2018

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

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

person Dave Markle    schedule 28.10.2010
comment
Мне нравится эта цитата, в частности, из Wiki . Аппаратная архитектура процессора x86 дополнена дополнительными адресными строками, используемыми для выбора дополнительной памяти, поэтому размер физического адреса увеличивается с 32 бит до 36 бит. Это теоретически увеличивает максимальный размер физической памяти с 4 ГБ до 64 ГБ. 32-битный размер виртуального адреса не изменяется, поэтому обычное прикладное программное обеспечение продолжает использовать инструкции с 32-битными адресами и (в модели с плоской памятью) ограничено 4 гигабайтами виртуального адресного пространства. - person ; 28.10.2010

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

person supercat    schedule 28.10.2010
comment
Похоже, вы хотите, чтобы 32-битный указатель был селектором сегмента. (И режимы адресации должны определять, какой компонент является сегментом, а какой - смещения?) Если аппаратное обеспечение ЦП должно искать базу / предел сегмента из таблицы дескрипторов сегмента, то вы только что заново изобрели таблицы страниц виртуальной памяти. , но, возможно, без фиксированного размера страницы. Так что столы будут гигантскими. Вам определенно понадобится какая-то TLB-подобная структура для кеширования недавно использованных базовых / лимитов сегментов, потому что в реальной x86 вы не можете использовать селектор сегментов без первого mov fs, eax или чего-то еще, что медленно . - person Peter Cordes; 05.04.2018
comment
В любом случае, я не понимаю, как это может быть без лишних накладных расходов, даже если вы перепроектируете сегментацию x86 даже больше, чем 386, поэтому вы не ограничены несколькими активными сегментами одновременно, а вместо этого можете использовать селектор сегментов. значение в регистре общего назначения как указатель. Это будет стоить сложности HW для реализации с любой хорошей производительностью, и, по-видимому, 386 было достаточно сложно просто потратить транзисторы на TLB для подкачки. (Или это могло бы полностью заменить пейджинг, но это сделало бы x86 странным и причудливым способом ISA, отличным от обычных с пейджингом.) - person Peter Cordes; 05.04.2018
comment
@PeterCordes: как очень простой подход, масштабируйте 32-битное значение на 4 бита, как это делал 8086, и ваше адресное пространство составляет 64 ГБ, а не 4. Обратите внимание, что некоторые реализации Java используют 32-битные ссылки, которые увеличиваются в разы. из 8, чтобы получить 35-битный адрес, так что это будет почти то же самое. В качестве несколько лучшего подхода используйте верхние 4 бита для выбора одной из 16 настраиваемых групп сегментов и масштабируйте оставшиеся 28 с помощью значения, которое настраивается для каждой группы. - person supercat; 05.04.2018
comment
@PeterCordes: этот подход не обеспечит проверку границ, но позволит использовать 32-битные ссылки, а не 64-битные. Переход к подходу с использованием дескриптора сегмента потребует наличия дескрипторов сегментов аппаратного кеша, но если бы первые несколько байтов каждого сегмента совместно использовали строку кэша с дескриптором, тогда код, который должен получить доступ к заголовку объекта, прежде чем обращаться к объекту, который к нему в последнее время не обращались (часто встречается в виртуальных машинах, таких как .NET), захватывало бы необходимую информацию одновременно с дескриптором кеша, сводя к минимуму накладные расходы. - person supercat; 05.04.2018
comment
Хорошо, это может работать, но определенно не с нулевыми накладными расходами. Чтобы получить байтовую адресацию внутри сегмента, вам необходимо использовать режимы адресации с двумя регистрами, такие как [ebx + eax], где основание рассматривается как сегмент, а индекс обрабатывается как смещение байта. Для статических объектов [disp32 + idx] может быть байтовым смещением внутри статического сегмента, но [disp32 + base] может обрабатывать disp32 как байтовое смещение (вне диапазона disp8) с базой в качестве сегмента. IDK, как будет расширена инструкция 8086 lea. Похоже, это сделало бы 386 сложной целью компилятора, особенно. для компиляторов того времени. - person Peter Cordes; 05.04.2018
comment
Или вы предлагаете, чтобы эта новая функция сегментации могла быть необязательной, с текущей моделью в качестве другого варианта (использование традиционных сегментных регистров и установка их всех на base = 0 / limit = 4G дает вам виртуальное адресное пространство с плоской страницей). Если вы хотите добавить в свой ответ какие-то свои комментарии, я сниму свой голос против. Особенно, если вы уберете предположение, что накладные расходы могут быть нулевыми. Ваша первая идея reg<<4 кажется, что приращения указателя всегда используют два регистра, если только приращение не зависит от степени детализации сегмента. (Я думаю, вы бы развернули, чтобы сохранить регистры ...) - person Peter Cordes; 05.04.2018