64 терабайта виртуальной памяти для 32-битной x86 с использованием сегментации: как? - PullRequest
2 голосов
/ 26 марта 2011

Модель памяти Intel x86 имеет сегментацию и разбиение на страницы.Что это означает, что система может адресовать до 64 терабайт виртуальной памяти.Насколько я понимаю, только 4 ГБ виртуальной памяти является адресуемой.Какой здесь разрыв?Это все в контексте 32-битного процессора

Вот математика:

2 ^ 13 (селекторы сегментов) * 2 (LDT или GDT) * 2 ^ 32 = 2 ^ 46 =64 терабайта.В литературе это называется общей виртуальной памятью.Они ошибочно называют это виртуальной памятью?Меня смущает то, что сам процессор имеет только 32-битные адресные строки.

Или они пытаются сказать, что это общая виртуальная память, которая может быть распределена суммарно (по всем процессам?)

Ответы [ 3 ]

1 голос
/ 27 марта 2011

Я думаю, что здесь говорится, что процессор x86 способен адресовать столько памяти, но это не так, как на практике.Это было бы возможно только в том случае, если бы программа использовала модель сегментированной памяти и использовала как полный сегмент, так и регистр GP, а процессоры были подключены таким образом.Однако сегодня программы обычно используют модель плоской памяти (которая может адресовать меньше памяти), а операционные системы не поддерживают адресацию такого большого объема памяти AFAIK.

И из §3.3.1 руководства [1] :

Модель сегментированной памяти - [...] Программы, работающие на процессоре IA-32, могут адресовать до 16383 [2 14 ] сегментов разных размеров и типов, и каждый сегмент может достигать 2 32 байт.

Таким образом, очевидно, что они подключены для адресации 2 46 (64 ТиБ) байтов (виртуальной и физической?) Памяти , но мы ограничены тем, какая модель памяти используется в программах и поддерживается ли операционная система.

1 голос
/ 01 февраля 2012

1) дескриптор сегмента выбирается из этих 2 ^ 13 * 2 = 2 ^ 14 селектором сегмента, который находится в отдельном регистре, поэтому он обходит ограничение в 32 адресных строки.

2) дескриптор сегмента содержит 32-битный адрес сегмента, который является 32-битным значением. Добавление к нему 32-битного смещения - это простое арифметическое добавление , поэтому вы получите 32-битный адрес. 2 ^ 32 = только 4 ГБ.

Дело в том, что сегменты могут перекрываться. Ошибка в вашей математике заключается в том, что индекс текущего дескриптора сегмента (14 бит) и смещение (32 бита) не объединяются. Они обрабатываются для формирования 32-разрядного линейного адреса.

Проверьте на этой странице для получения дополнительной информации о сегментации памяти x86.

1 голос
/ 26 марта 2011

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

...