Таблицы страниц процесса - PullRequest
4 голосов
/ 08 июля 2011

Я заинтересован в более глубоком понимании механизма виртуальной памяти и страниц, особенно для систем Windows x86.Из того, что я собрал из различных онлайн-ресурсов (включая другие вопросы, размещенные на SO),

1) Таблицы отдельных страниц для каждого процесса расположены в адресном пространстве ядра этого же процесса.* 2) Для каждого процесса существует только одна таблица страниц, содержащая отображение виртуальных страниц на физические страницы (или фреймы).

3) Физический адрес, соответствующий данному виртуальному адресу, рассчитывается управлением памятьюединица (MMU), по существу, используя первые 20 бит предоставленного виртуального адреса в качестве индекса таблицы страниц, используя этот индекс для получения начального адреса физического кадра, а затем применяя некоторое смещение к этому адресу в соответствии с оставшимися 12 битамивиртуального адреса.

Верны ли эти три утверждения?Или я неправильно истолковываю информацию?

Ответы [ 2 ]

10 голосов
/ 09 июля 2011

Итак, сначала давайте уточним некоторые вещи:

  1. В случае архитектуры x86, не операционная система определяет политику подкачки, это ЦП (точнее, MMU),То, как операционная система рассматривает систему подкачки, не зависит от того, как она реализована.Как правильно заметил комментатор, в моделях подкачки есть специальный компонент ОС.Это зависит от способа работы оборудования.
  2. 32-битные и 64-битные процессоры x86 имеют разные схемы разбиения на страницы, поэтому вы не можете говорить о модели разбиения на x86 без указания размера слова процессора.

Ниже приведена сжатая версия 32-битной модели подкачки x86, использующая простейшую версию.Существует множество дополнительных настроек, и я знаю, что их используют различные ОС.Я не буду вдаваться в подробности, потому что я не очень хорошо знаком с внутренностями большинства ОС и потому что вам действительно не стоит углубляться в это, пока вы не разберетесь в более простых вещах.Если вы хотите узнать все удивительные особенности модели подкачки x86, вы можете обратиться к документации Intel: Руководство по системному программированию Intel

В простейшей модели подкачки пространство памятиразделен на блоки по 4 КБ, называемые страницами.Непрерывный кусок из 1024 из них сопоставлен с таблицей страниц (которая также имеет размер 4 КБ).Для дальнейшего уровня косвенности все 1024-страничные таблицы отображаются в каталог страниц размером 4 КБ, а база этого каталога находится в специальном регистре %cr3 в процессоре.Эта двухуровневая структура имеет место, потому что большинство областей памяти в ОС разрежено , что означает, что большая часть из них не используется.Вы не хотите хранить кучу таблиц страниц для памяти, которая не затрагивается.

Когда вы получаете адрес памяти, самый значительный 10-битный индекс в каталоге страниц, который дает вам базутаблицы страниц.Следующие 10 битов заносятся в таблицу страниц, чтобы дать вам основу физической страницы (также называемой физическим фреймом).Наконец, последние 12 битов указываются в кадре.MMU делает все это за вас, при условии, что вы установили %cr3 на правильное значение.

64-битные системы имеют систему подкачки 4 уровня , поскольку их области памяти намного большескудны.Кроме того, возможны страницы размером не 4 КБ.

Чтобы на самом деле получить ответы на свои вопросы:

  1. Вся эта информация подкачки (таблицы, каталоги и т. Д.) Находится в памяти ядра.,Обратите внимание, что память ядра - это один большой кусок, и не существует понятия, что память ядра для одного процесса.
  2. Существует только одна страница директория на процесс.Это связано с тем, что каталог страниц определяет пространство памяти, а каждый процесс имеет ровно одно пространство памяти.
  3. В последнем абзаце приведен способ выделения адреса.

Редактировать:Очистка и незначительные модификации.

1 голос
/ 09 июля 2011

В целом, это в значительной степени правильно.

Если память используется, некоторые детали немного не совпадают:

  1. Пейджинг памяти ядра не меняется для каждого процесса, поэтому все таблицы страниц всегда видныв ядро.
  2. Теоретически, существует также шаг перевода на основе сегментов.Однако большинство практических систем (например, * BSD, Linux, Windows, OS / X) используют сегменты с базовым значением, равным 0, и ограничением, установленным для предела адресного пространства, поэтому этот этап заканчивается как NOP.
...