Машинно-зависимый код описывает, как осуществляется физическое отображение между виртуальными адресами процессов пользователя и ядра и физическими адресами оперативной памяти. Эта функция отображения включает вдобавок к трансляции адресов управление правами доступа. В FreeBSD модуль физического отображения (physical-mapping module - pmap) управляет машинно-зависимой трансляцией и таблицами доступа, которые используются аппаратурой управления памятью либо непосредственно, либо опосредованно. Например, на PC pmap поддерживает для каждого процесса, а также для ядра постоянно находящийся в памяти каталог и таблицы страниц. Машинно-зависимое состояние, необходимое для описания трансляции и прав доступа к отдельной странице, часто называют отображением (mapping) или структурой отображения.
Интерфейс pmap FreeBSD почти идентичен интерфейсу в Mach 3.0 и разделяет многие особенности дизайна с Mach 3.0. Модуль pmap предназначен для того, чтобы быть логически независимым от более высоких уровней системы виртуальной памяти. Интерфейс имеет дело строго с машинно-независимыми выровненными по границе страницы виртуальными и физическими адресами и машинно-независимыми правами доступа. Машинно-независимый размер страницы может быть кратным поддерживаемому архитектурой размеру страницы. Таким образом, действия pmap должны иметь возможность влиять более чем на одну физическую страницу в логической странице. Машинно-независимая защита является простым кодированием битов разрешений на чтение, запись и исполнение, pmap должен отображать все возможные комбинации в действительные специфичные для архитектуры значения.
Pmap процесса рассматривается как кеш информации об отображении, хранящейся в машинно-зависимом формате. Ему как таковому не нужно содержать полное состояние для всех действительных отображений. Состояние отображения является ответственностью машинно-независимого уровня, за одним исключением: модуль pmap может по своему усмотрению отбросить состояние отображения для возвращения ресурсов. Исключением являются переданные (wired) отображения, которые никогда не должны вызывать отказ, который достигает машинно-независимую процедуру vmfault(). Таким образом, состояние для переданных отображений должно быть сохранено в pmap до тех пор, пока оно не будет удалено явным образом.
Вообще, процедуры pmap могут действовать либо с набором отображений, определенных диапазоном виртуальных адресов, либо со всеми отображениями для определенного физического адреса. Способность действовать с отдельными или всеми виртуальными отображениями для физической страницы требует, чтобы сведения об отображении, поддерживаемые модулем pmap, легко находились как по виртуальному, так и по физическому адресам. Для таких архитектур, как PC, которые поддерживают резидентные таблицы страниц, преобразование виртуального в физический, или прямой поиск, может быть простой эмуляцией прохождения аппаратной таблицы страниц. Преобразование физического в виртуальный, или обратный поиск, использует список структур pventr, для нахождения всех элементов таблицы страниц, ссылающихся на страницу. Список может содержать множество элементов, только если разрешено совмещение виртуальных адресов.
Есть две стратегии, которые можно использовать для управления ресурсами памяти pmap, такими, как каталог пользователя или память таблицы страниц. Традиционным и самым простым подходом является управление модулем pmap своей собственной памятью. При этой стратегии модуль pmap может захватить во время загрузки системы фиксированное количество зарезервированной (wired) физической памяти, отобразить эту память в адресное пространство ядра и выделять участки памяти для своих собственных структур данных по мере необходимости. Основное преимущество в том, что этот подход изолирует потребности в памяти модуля pmap от оставшейся системы и ограничивает зависимости модуля pmap от других частей системы. Этот дизайн согласуется с уровневой моделью системы виртуальной памяти, в которой pmap является самым нижним и, следовательно, самостоятельным уровнем.
Недостаток в том, что этот подход требует дублирования многих из функций управления памятью. У модуля pmap есть свои распределитель и освободитель памяти для своей индивидуальной кучи - кучи с фиксированным размером, которую нельзя подгонять под изменяющиеся требования к памяти в масштабах всей системы. Для архитектуры с резидентными таблицами страниц она должна отслеживать несмежные участки таблиц страниц процесса, поскольку процесс может заполнять свое адресное пространство разбросанным образом. Удовлетворение этого требования ведет к дублированию большой части стандартного кода управления списками, который используется, например, кодом vmjnap.
Альтернативный подход, используемый PC, заключается в применение рекурсивного использования кода виртуальной памяти более высокого уровня для управления некоторыми ресурсами pmap. Здесь 4-килобайтный каталог страниц для каждого процесса пользователя отображается в адресное пространство ядра как часть настройки процесса и остается резидентной до тех пор, пока процесс не завершится. Пока процесс работает, элементы его таблиц страниц отображены в виртуально непрерывный 4-мегабайтный массив элементов таблиц страниц в адресном пространстве ядра. Такая организация ведет к невидимой оптимизации сохранения памяти, использующейся в модуле pmap PC, где страница таблицы страниц ядра, описывающая 4-мегабайтный диапазон таблиц страниц пользователя, может дублироваться как каталог страниц пользователя. Ядро поддерживает также альтернативные отображения для хранения отдельных страниц таблицы страниц других неработающих процессов, если ему нужно получить доступ к их адресному пространству.
Использование одних и тех же процедур выделения страниц, как и всех других частей системы, гарантирует, что физическая память выделяется лишь при необходимости и из системного пула свободной памяти. Таблицы страниц и другие ресурсы pmap также могут выделяться из выгружаемой памяти ядра. Этот подход легко и эффективно поддерживает большие разрозненные адресные пространства, включая собственное адресное пространство ядра.
Основным недостатком является то, что этот подход нарушает независимую природу интерфейса. В частности, рекурсивная структура ведет к проблемам тупиков с глобальными многопроцессорными циклическими блокировками, которые могут удерживаться, пока ядро вызывает процедуру pmap.
Структуры данных pmap содержатся в каталоге машинно-зависимых включаемых файлов в файле pmap. h Большая часть кода для этих процедур находится в каталоге машинно-зависимых исходных файлов в файле pmap. с. Главными задачами модуля pmap являются следующие.
· Инициализация и запуск системы (pmap_bootstrap(), pmapJnit(), pmap_growkemel()).
· Выделение и освобождение отображений физических страниц на виртуальные (pmap_enter(), pmap_remove(), pmap_()enter(), pmap()remove()).
· Изменение прав доступа и других атрибутов отображения (pmap_change_wiring(), pmap_page_protect(), pmapj)rotect(f).
· Поддержание информации об использовании физических страниц (pmap_clear_modify(), pmap clear_reference(), pmapJsjnodifled(), pmap_ts_referenced(J).
· Инициализация физических страниц (pmap_сору_page(), pmap_zero_page()).
· Управление внутренними структурами данных (pmap_pinit(), pmap_release()).
- 11/11/2010 20:28 - Изменение для отображений атрибутов доступа и резервирования
- 09/11/2010 09:04 - Операции, определенные пейджером
- 08/11/2010 13:50 - Выделение и освобождение отображения
- 06/11/2010 08:32 - Инициализация и запуск
- 05/11/2010 00:51 - Завершение процесса
- 02/11/2010 21:26 - Переносимость
- 02/11/2010 12:16 - Процесс подкачки
- 01/11/2010 22:58 - Подкачка процессов
- 01/11/2010 08:04 - Изменение защиты
- 31/10/2010 22:44 - Отображение файлов