Как именно работает проецирование файла в память?
При проецировании файла в память этому файлу сопоставляется регион адресного пространства процесса. Но что именно заносится в таблицу страниц процесса?
Ответы (1 шт):
Есть таблица страниц, но не менее важный аспект это Virtual Memory Area (VMA). Это та память, с которой обычно работают процессы в ОС.
В таблице страниц:
- Хранятся флаги (Present, Dirty, Accessed), тип отображения, а также физический адрес (если страница загружена в память).
- Нет данных о файле (путь, смещение) — эти метаданные не помещаются в компактные записи таблицы страниц.
В виртуальной памяти (VMA):
- VMA — это объекты ядра, описывающие непрерывные диапазоны виртуальных адресов процесса. В них хранится:
- Начальный и конечный виртуальные адреса региона.
- Права доступа (read/write/execute).
- Ссылку на файл (если регион связан с отображением файла).
- Смещение (offset) в файле, соответствующее началу региона.
- При обработке page fault ядро находит VMA, связанный с виртуальным адресом, и извлекает из него информацию о файле и смещении.
- VMA — это объекты ядра, описывающие непрерывные диапазоны виртуальных адресов процесса. В них хранится:
Алгоритм работы с файлом
Шаг 1: Процесс запрашивает отображение файла (например
mmap, если говорим про linux).- Ядро создает VMA, сохраняя в нём путь к файлу, смещение, права доступа и диапазон виртуальных адресов.
- В таблицу страниц добавляются записи для виртуальных адресов, но
Present bit = 0(в этот момент страницы ещё не загружены).
Шаг 2: При первом доступе к странице (чтение/запись):
- Генерируется событие page fault, так как страница отсутствует в памяти (
Present bit = 0). - Ядро находит VMA, соответствующий виртуальному адресу, извлекает из него файл и смещение в нём.
- Загружает нужную страницу файла в физическую память.
- Обновляет запись в таблице страниц:
Present bit = 1, физический адрес, флаги доступа.
- Генерируется событие page fault, так как страница отсутствует в памяти (
Важно ещё разделять виды отображения
Shared mapping: Изменения страницы
Dirty bit = 1могут синхронизироваться с файлом (в зависимости от настроек и политик ОС). Физическая страница может быть общей для нескольких процессов.Private mapping (Copy-on-Write): При попытке записи генерируется новый page fault. ОС создает копию страницы для процесса, помечает ее как приватную, и обновляет таблицу страниц.
Почему таблица страниц и VMA разделены?
- С точки зрения производительности: Таблица страниц оптимизирована для быстрого преобразования виртуальных адресов в физические. Хранение метаданных файлов в ней увеличило бы её размер, процесс чтения таблицы длился бы дольше, а также это дополнительная нагрузка на аппаратную составляющую. Иными словами, нам достаточно пробежаться по оглавлению.
- С точки зрения гибкости: VMA позволяют ядру управлять сложными сценариями. Например, отображение одного файла в несколько регионов, Copy-on-Write, shared/private mapping.