Важной ролью модуля pmap являются действия по управлению аппаратными правами доступа к страницам. Эти действия могут применяться ко всем отображениям, охватываемым диапазоном виртуальных адресов в pmap, посредством pmap_protect(), или они могут применяться ко всем отображениям определенной физической страницы через pmap посредством pmap_page_protect(). У обоих вызовов есть два общих свойства. Во-первых, любой из них может быть вызван со значением права доступа
VMPROTNONE для удаления диапазона виртуальных адресов или для удаления всех отображений для определенной физической страницы. Во-вторых, эти процедуры никогда не должны добавлять право на запись для соответствующих отображений. Таким образом, вызовы, включающие VM_PROT_WRITE, не должны делать никаких изменений. Это ограничение необходимо для нормальной работы механизма копирования при записи. Запрос на право записи в страницу делается лишь в структуре vmjnapentry. Когда позже процесс сделает попытку записи в страницу, возникнет отказ страницы. Обработчик отказа страницы исследует vm тар_entry и определит, что запись должна быть разрешена. Если это страница с атрибутом копирования при записи, обработчик отказа сделает перед вызовом pmapenter() любые необходимые для обеспечения записи на странице копии. Поэтому право записи на страницу добавляется лишь через вызовы pmapjrnter().
Pmap_protect() используется главным образом системным вызовом mprotect для изменения прав доступа для области адресного пространства процесса. Стратегия сходна сpmapremove(): просмотр в цикле всех виртуальных страниц в диапазоне и применение изменений ко всем действительным найденным отображениям. Недействительные отображения пропускаются.
Для PC pmap_protect() сначала проверяет особые случаи. Если запрошено право доступа VMPROTNONE, она вызывает pmapremove(), чтобы отменить все права доступа. Если включено VMPROTWRITE, она просто сразу же возвращается. Для обычного значения права доступа pmapremove() проходит в цикле данный диапазон адресов, пропуская недействительные отображения. Для действительных отображений отыскивается элемент таблицы страниц, и если новое значение права доступа отличается от текущего значения, элемент изменяется, a TLB и кеш сбрасываются. Как и в случае с pmap_remove(), любые глобальные действия с кешем отсрочиваются до тех пор, пока не будет модифицирован весь диапазон.
Pmap_page_protect() внутренне используется системой виртуальной памяти в двух целях. Она вызывается для установки права доступа только для чтения, когда устанавливается операция копирования при записи (например, в ходе fork). Она также удаляет все права доступа перед замещением страницы, чтобы заблокировать все ссылки на страницу до завершения операции. В Mach эта процедура используется в виде двух отдельных процедур - pmap_clearjptes() и pmap_remove_all(),- и многие модули pmap реализуют pmap_page_protect() в виде вызова одной или другой из этих функций в зависимости от аргументов прав доступа.
В реализации pmap _page_protect() PC, если запрошен VMPROTWRITE, она возвращается, ничего не делая. Добавление возможности записи должно быть сделано на постраничной основе процедурой обработки отказа страницы, как описано для pmapjjrotect(). В противном случае она обходит список структур pv_entry для этой страницы, отменяя отдельные отображения. Как и в случае с pmap protect(), элемент проверяется, чтобы гарантировать его изменение, до того как будут осуществлены дорогостоящие очистки TLB и кеша. Обратите внимание, что очистка TLB и кеша отличаются по сравнению с pmap_remove(), поскольку они должны сделать недействительными элементы в контекстах нескольких процессов, а не несколько элементов в контексте одного процесса.
Pmap_changewiring() вызывается для резервирования (wire) или снятия резервирования (unwire) единственной машинно-независимой виртуальной страницы внутри pmap. Резервирование информирует модуль pmap о том, что отображение не должно вызвать аппаратный отказ, который достигнет машинно-независимого кода vm_fault(). Резервирование обычно является программным атрибутом, который не влияет на аппаратное состояние MMU: оно просто сообщает pmap не отбрасывать состояние отображения. По существу, если модуль pmap никогда не сбрасывает состояние, для модуля не является обязательным даже отслеживать состояние резервирования страниц. Единственным побочным эффектом неотслеживания информации о резервировании в pmap является то, что системный вызов mlock не может быть полностью реализован без статистики подсчета зарезервированных страниц.
Реализация pmap PC поддерживает сведения о резервировании. Неиспользуемый бит в структуре элемента таблицы страниц записывает состояние резервирования страницы. pmap_change_wiring() устанавливает или сбрасывает этот бит, когда вызывается с действительным виртуальным адресом. Поскольку бит резервирования игнорируется аппаратурой, нет необходимости в изменении TLB или кеша при изменении этого бита.
- 15/11/2010 23:40 - Управление внутренними структурами данных
- 13/11/2010 18:21 - Инициализация физических страниц
- 13/11/2010 07:13 - Управление информацией об использовании страницы
- 09/11/2010 09:04 - Операции, определенные пейджером
- 08/11/2010 13:50 - Выделение и освобождение отображения
- 06/11/2010 08:32 - Инициализация и запуск
- 05/11/2010 00:51 - Завершение процесса
- 04/11/2010 18:14 - Роль модуля pmap