Главной ответственностью модуля pmap является утверждение (выделение) и отмена (освобождение) отображений физических страниц на виртуальные адреса. Физические страницы представляют квитированные части объекта, который предоставляет данные из файла или анонимной области памяти. Физическая страница связана с виртуальным адресом, поскольку этот объект отображен в адресное пространство процесса либо явно посредством ттар, либо неявно посредством fork или exec. Отображения физических адресов в виртуальные не создаются во время отображения этого адреса; вместо этого этот критерий откладывается до первой ссылки на определенную страницу. В этот момент возникнет отказ доступа и будет вызван pmap enter(). pmap_enter() отвечает за все необходимые побочные эффекты, связанные с созданием нового отображения. Такие побочные эффекты в значительной степени являются результатом введения второй трансляции для уже отображенной физической страницы - например, в результате операции копирования при записи. Обычно эта операция требует сброса элементов TLB или кеша одного или нескольких процессоров для сохранения непротиворечивости.
Кроме своего использования для создания новых отображений pmap_entry() может также вызываться для изменения атрибутов резервирования или защиты существующего отображения или для повторной привязки существующего отображения для виртуального адреса к новому физическому адресу. Ядро может осуществлять изменение атрибутов путем вызова процедуры соответствующего интерфейса. Изменение конечного физического адреса отображения является просто вопросом удаления сначала старого отображения, а затем обработки его подобно любому другому запросу нового отображения.
Pmap_enter(j является единственной процедурой, которая не может терять состояние или отсрочивать свое действие. При вызове она должна создать запрошенное отображение и проверить это отображение до возвращения вызывающему. На PC pmap_enter() должна сначала проверить, существует ли для запрошенного адреса элемент таблицы страниц. Если в запрошенном для нового отображения месте таблице страниц процесса еще не была выделена физическая страница, выделяется заполненная нулями страница, резервируется и вводится в каталог страниц процесса.
После проверки того, что для введения отображения все ресурсы таблиц страниц существуют, pmap_enter() проверяет или модифицирует запрошенное отображение следующим образом.
1. Проверяет, существует ли уже структура отображения для данного преобразования виртуального адреса в физический. Если да, должен быть сделан вызов для изменения атрибутов защиты или резервирования отображения; он осуществляется.
2. В противном случае, если для этого виртуального адреса отображение существует, но он ссылается на другой физический адрес, это отображение удаляется.
3. Число ссылок на страницу таблицы страниц увеличивается каждый раз, когда добавляется ссылка на новую страницу, и уменьшается каждый раз, когда удаляется ссылка на старую страницу. Когда удаляется последняя действительная страница, число ссылок сравнивается с нулем, и страница таблицы страниц освобождается, поскольку она не содержит полезной информации.
4. Создается и проверяется элемент таблицы страниц, при необходимости с очищением элементов кеша и TLB.
5. Если физический адрес находится вне диапазона, управляемого модулем pmap (например, страница буфера кадра), структура pvjzntry не нужна. В противном случае для случая нового отображения для физической страницы, которая отображена в адресное пространство, создается структура pv_entry.
6. Для машин с виртуально индексируемым кешем делается проверка, содержит ли уже данная физическая страница другие отображения. Если да, может потребоваться пометить все отображения для запрещения кеширования, чтобы избежать несогласованности кеша.
Когда отменяется отображение объекта в адресное пространство, либо явно посредством типтар, либо неявно при завершении процесса, вызывается модуль pmap для отмены и удаления отображений для всех физических страниц, кеширующих данные для объекта. В отличие от pmap_enter(), pmap_remove() можно вызвать с диапазоном виртуальных адресов, включающих более одного отображения. Поэтому ядро осуществляет снятие отображения путем прохождения в цикле всех виртуальных страниц в диапазоне с игнорированием тех, для которых нет отображения, и удалением тех, для которых оно есть.
Pmap_remove() на PC проста. Она просматривает в цикле указанный диапазон адресов, отменяя отображения отдельных страниц. Поскольку pmap_remove() может вызываться с большими сильно разбросанными выделенными областями, такими, как весь диапазон виртуальных адресов процесса, она должна разумно пропускать недействительные элементы в пределах диапазона. Она пропускает недействительные элементы, проверяя сначала в каталоге таблиц определенный адрес и, если элемент недействительный, переходя к границе следующих 4 Мбайт. Когда все отображения страниц были отменены, осуществляется необходимая глобальная очистка кеша.
Чтобы отменить отдельное отображение, ядро находит и помечает как недействительный соответствующий элемент таблицы страниц. Биты ссылок и изменений для этой страницы сохраняются в структуре vm_page страницы для будущего восстановления. Если это отображение было пользовательским, счетчик ссылок на страницу таблицы страниц уменьшается. Когда счетчик достигает нуля, страницу таблицы страниц можно вернуть, поскольку она больше не содержит действительных отображений. Когда страница таблицы страниц удаляется из адресного пространства ядра (т. е. в результате удаления из этой страницы последнего действительного отображения пользователя), должен быть обновлен каталог страниц процесса. Ядро осуществляет это обновление, делая недействительным соответствующий элемент каталога страниц. Если физический адрес из отображения находится за пределами управляемого диапазона, ничего не делается. В противном случае находится и освобождается структура pventry.
Pmap()enter() и pmap ()remove() являются более быстрыми версиями функций pmap enter() и pmap_remove(), которые могут использоваться ядром для быстрого создания и удаления временных отображений. Они могут использоваться лишь для невыгружаемых отображений в адресном пространстве ядра. Например, процедуры управления буферным кешем используют эти процедуры для отображения страниц файлов в память ядра таким образом, что они могут читаться или записываться файловой системой.
- 15/11/2010 23:40 - Управление внутренними структурами данных
- 13/11/2010 18:21 - Инициализация физических страниц
- 13/11/2010 07:13 - Управление информацией об использовании страницы
- 11/11/2010 20:28 - Изменение для отображений атрибутов доступа и резервирования
- 09/11/2010 09:04 - Операции, определенные пейджером
- 06/11/2010 08:32 - Инициализация и запуск
- 05/11/2010 00:51 - Завершение процесса
- 04/11/2010 18:14 - Роль модуля pmap
- 02/11/2010 21:26 - Переносимость
- 02/11/2010 12:16 - Процесс подкачки