Машинно-независимому коду управления страницами нужно иметь возможность получать от нижележащего оборудования основную информацию об использовании и изменениях страниц. Модуль pmap способствует сбору этой информации, не требуя от машинно-независимого кода понимания деталей таблиц отображения, предоставляя набор интерфейсов для запроса и сбрасывания битов ссылок и модификации. Демон выгрузки может вызвать vm_page_test_dirty() для определения того, грязная ли страница. Если страница грязная, демон выгрузки может записать ее в резервное хранилище, а затем вызвать pmap clear_modify(), чтобы сбросить бит модификации. Таким же образом, когда демон выгрузки сбрасывает или инактивирует страницу, он использует pmap clear_reference() для сбрасывания бита ссылки на страницу. Когда он хочет обновить счетчик активности страницы, он используетpmapJsj-eferenced(), чтобы подсчитать число использований страницы с момента последнего просмотра.
Одной важной особенностью процедур запросов является то, что они должны возвращать действительную информацию, даже если в настоящее время для нужной страницы нет отображений. Таким образом, информация о ссылках и модификациях не может быть просто собрана из аппаратно поддерживаемых битов различных элементов таблиц страниц или TLB; скорее, должно быть место, где информация сохраняется, когда отображение удаляется.
Для PC информация о модификации для страницы хранится в поле dirty структуры vm_page. Первоначально сброшенная информация обновляется каждый раз, когда рассматривается отображение страницы для удаления. Процедура vm_page_test_dirty() сначала проверяет поле dirty и, если бит установлен, сразу возвращает TRUE. Поскольку этот массив атрибутов содержит лишь прошлые сведения, ей по-прежнему нужно проверить состояние битов в элементах таблиц страниц для текущих отображений страницы. Эта информация проверяется путем вызова процедуры pmap_is jnodified(); которая сразу же возвращает FALSE, если ей не передана управляемая ею физическая страница. В противном случае pmap_isjnodified() обходит структуры pv_entry, связанные с физической страницей, проверяя бит модификации для связанных с элементом таблицы страниц pv_entry. Она может вернуть TRUE, как только встретит установленный бит, или FALSE, если этот бит не установлен ни в одном элементе таблицы страниц.
Сведения о ссылках на страницу хранятся в поле actjzount и в качестве флага ее структуры vm_page. Первоначально сброшенная, эта информация периодически обновляется демоном выгрузки. Во время сканирования памяти демон выгрузки вызывает процедуру pmapJsj-eferenced() для сбора числа ссылок на страницу. Процедура pmapts_reference() возвращает ноль, если ей не передали управляемую физическую страницу. В противном случае она обходит структуры pventry, связанные с физической страницей, проверяя и сбрасывая бит ссылки для связанных с элементом таблицы страниц pv_entry. Она возвращает найденное количество битов ссылки.
Процедуры очистки также сразу же возвращаются, если им не передана управляемая ими физическая страница. В противном случае в массиве атрибутов бит ссылки или модификации сбрасывается, и они обходят в цикле все структуры pvjzntry, связанные с физической страницей, сбрасывая поддерживаемые аппаратно биты элементов таблицы страниц. Этот последний шаг может вызывать очистку TLB или кеша по ходу дела или потом.
- 13/11/2010 18:21 - Инициализация физических страниц
- 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 - Переносимость