Пейджер vnode управляет объектами, которые отображают файлы в файловой системе. Каждый раз, когда файл открывается либо явно посредством open, либо неявно посредством exec, система должна найти существующий vnode, который его представляет, или, если для файла не существует vnode, выделить для него новый vnode. Частью выделения нового vnode является выделение объекта для хранения страниц файла и для связывания с объектом пейджера vnode. Описатель объекта устанавливается для указания на vnode, а индивидуальные данные хранят размер файла. Каждый раз при изменении размера vnode объект информируется через вызов vnode_pager_setsize().
Когда процедурой пейджера vnode pgo_getpages() получен запрос загрузки страницы, ему передается массив физических страниц, размер массива и индекс в массиве страницы, которая нужна. Должна быть прочитана только нужная страница, но поддерживается предоставление процедурой pgojgetpages() и других страниц, которые можно легко прочесть в то же самое время. Например, если запрошенная страница в середине блока файла, файловая система обычно читает весь блок файла, поскольку блок файла можно прочесть в ходе одной операции ввода/вывода. Большее чтение заполнит запрошенную страницу вместе с окружающими ее страницами. Ввод/вывод осуществляется с использованием буфера физического ввода/вывода, отображающего страницы, которые нужно прочесть, в адресное пространство ядра достаточно долго, чтобы пейджер вызвал процедуру стратегии драйвера устройства для загрузки страниц с содержимым файла. Когда страницы заполнены, отображение ядра может быть удалено, буфер физического ввода/вывода может быть освобожден, а страницы могут быть возвращены.
Когда у пейджера vnode запрашивают сохранение освобождаемых страниц, он просто организует запись страницы обратно в ту часть файла, из которой она поступила. Запрос осуществляется процедурой pgo_getpages(), которой передается массив физических страниц, размер массива и индекс в массиве страницы, которая должна быть записана. Должна быть записана лишь нужная страница, но поддерживается запись процедурой pgo_putpages() и других страниц, которые можно легко обработать в то же самое время. Файловая система запишет все страницы, которые находятся в одном блоке файловой системы вместе с нужной страницей. Как в случае с процедурой pgo_getpages(), страницы отображаются в ядро лишь на время операции записи.
Если файл отображается индивидуально, модифицированные страницы не могут быть записаны обратно в файловую систему. Такое индивидуальное отображение должно использовать для всех модифицированных страниц теневой объект с пейджером подкачки. Таким образом, индивидуально отображенный объект никогда не будет запрошен для сохранения каких-либо грязных страниц в нижележащем файле.
Исторически ядро BSD имело отдельные кеши для файловых систем и виртуальной памяти. FreeBSD устранило буферный кеш файловой системы, заменив его кешем виртуальной памяти. У каждого vnode есть связанный с ним объект, а блоки файла хранятся в страницах, связанных с объектом. Доступ к данным файла осуществляется с использованием тех же самых страниц независимо от того, отображены ли они в адресное пространство, или доступ к ним осуществляется посредством чтения или записи. Дополнительной выгодой такого дизайна является то, что кеш файловой системы больше не ограничен адресным пространством в ядре, которое может быть ему выделено. При отсутствии других требований на системную память она вся может быть выделена для кеширования данных файловой системы.
- 21/10/2010 20:16 - Индивидуальное отображение
- 20/10/2010 10:09 - Отображения и подотображения ядра
- 19/10/2010 09:38 - Пейджер устройств
- 18/10/2010 22:14 - Управление памятью ядра
- 18/10/2010 09:01 - Обзор системы виртуальной памяти FreeBSD
- 17/10/2010 03:20 - Интерфейс пейджера
- 16/10/2010 15:44 - Аппаратные требования для виртуальной памяти
- 15/10/2010 01:00 - Разделяемое отображение
- 14/10/2010 09:29 - Преимущества виртуальной памяти
- 12/10/2010 18:29 - Модель mmap