Как определяются размеры указателей в компьютерных системах? Через виртуальные или физические адреса? - PullRequest
0 голосов
/ 23 октября 2019

Завтра у меня экзамен по трансляции адресов виртуальной памяти, и я довольно запутался в этой теме. Я знаю, что процессор сгенерирует виртуальный адрес для доступа к физическому адресу. Так что если у нас есть система с 32-битными виртуальными адресами и 64-битными физическими адресами, то я предполагаю, что указатели для процессов на уровне пользователя будут 8 байтов. Моя логика заключается в том, что виртуальный адрес переводится на физический адрес, поэтому этот номер всегда будет поступать с физического адреса.

Ответы [ 3 ]

2 голосов
/ 24 октября 2019

Нет, процессы пользовательского пространства работают только с виртуальными адресами (32-разрядные в вашем примере).

Память, которую они «видят», является их собственным виртуальным адресным пространством. (Они могут совершать системные вызовы, такие как mmap и munmap, чтобы запросить, чтобы страницы в этом адресном пространстве были поддержаны файлами или анонимным ОЗУ, как для C malloc.) Но они ничего не знают о том, где в физическая память, на которой расположены эти страницы.

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


Аппаратное обеспечение преобразует виртуальные адреса в физические адреса на . каждый доступ к памяти. Чтобы сделать это быстро, TLB кэширует недавно использованные переводы. В случае пропуска TLB аппаратное обеспечение выполняет «обход страниц», читая таблицы страниц, чтобы найти правильную виртуальную страницу-> перевод физической страницы.

ОС управляет таблицами страниц, выбирая любую физическую страницу в качестве «резервной копии». для виртуальной страницы.


Физические адреса шире, чем виртуальные?

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

Размер физического адресного пространства ограничивает объем ОЗУ, который можно поместить в общее количество компьютеров, и можетотличаться от того, сколько любой отдельный процесс может использовать одновременно. Изменение таблиц страниц происходит быстрее, чем чтение с диска, поэтому, даже если все они не могут быть отображены одновременно, ядро ​​все равно может использовать много физической памяти для кэша страниц (кэш содержимого файла с диска).

Что еще более важно, может быть запущено несколько процессов, каждый с собственным виртуальным адресным пространством объемом до 4 ГБ, поддерживаемым физической памятью, вплоть до объема физической памяти в системе. На ЦП с несколькимиядра, они могут работать одновременно, что позволяет одновременно использовать более 4 ГБ ОЗУ. Но не с помощью какого-либо отдельного процесса.

x86 является хорошим примером здесь: запуск ядра x86-64 с 32-разрядным пользовательским пространством дает нам в значительной степени описанную вами ситуацию. (64-битное ядро ​​может использовать 64-битные виртуальные адреса, но не обращайте на это внимания, просто посмотрите на пространство пользователя.)

Вы можете иметь несколько процессов каждый , используя около 4 ГБ физической ОЗУ.

В формате таблицы страниц x86-64 есть место для физических адресов шириной до 52 бит, хотя текущее HW не использует так много. (Только в объеме оперативной памяти, который он на самом деле поддерживает присоединение. Сохраняет биты в TLB и других частях ЦП). https://en.wikipedia.org/wiki/X86-64#Architectural_features

До появления x86-64 32-разрядные ядра x86 могли использовать тот же формат таблиц страниц, но с 36-разрядными физическими адресами на процессорах Pentium Pro и более поздних версий. https://en.wikipedia.org/wiki/Physical_Address_Extension. Это позволило до 64 ГБ физической памяти. (32-разрядное ядро ​​обычно резервирует для себя 1 или 2 ГБ виртуального адресного пространства, поэтому каждый процесс может использовать только до 3 или 2 ГБ, но это та же идея. Не проблема для 32-разрядного пользовательского пространства под 64-битное ядро, так что это сделал более простой пример.)

0 голосов
/ 24 октября 2019

Программист будет видеть только виртуальные адреса. Физическое адресное пространство непрозрачно для программиста и пользователя. Следовательно, размер указателя зависит от размера виртуального адреса. В конкретном случае, который вы указали, максимальный объем памяти, который может использовать ваша система, определяется вашим виртуальным адресным пространством. Вот почему 32-разрядная ОС на 64-разрядном оборудовании ограничена максимум 4 гигабайтами памяти. Но в случае 64-битного виртуального адреса, даже если у нас недостаточно оперативной памяти, мы можем разгрузить некоторые страницы во вторичное хранилище, чтобы создать иллюзию, что у нас больше доступной оперативной памяти. В случае, если страница находится во вторичной памяти, происходит сбой страницы, и страница переносится в ОЗУ.

Редактировать: Как сказал Питер в комментариях, ограничение виртуального адреса влияет на максимальный объем памяти, который может использовать Процесс.

0 голосов
/ 23 октября 2019

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

Затем системе / ядру необходимо каким-то образом выполнить перевод. Он будет знать виртуальный адрес и должен преобразовать его в физический адрес, так что в итоге у него будет физический указатель, 64-битный = 8 байт. Но еще раз, этот адрес / указатель предназначен только для «внутреннего использования».

На практике, однако, у вас будут виртуальные и физические адреса одинакового размера, соответствующие размеру слова ЦП и его архитектуре (x86против x86_64). Виртуальное преобразование в обычное преобразование обычно должно происходить при сбое страницы, которое происходит, когда процесс пользовательского уровня пытается получить доступ к не загруженной памяти. Прежде всего, чтобы получить к нему доступ, необходимо, например, разыменовать указатель, указывающий на этот адрес, что будет сделано с помощью инструкции доступа к памяти конкретной архитектуры ЦП, которая выполняется с адресами размером в слово.

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