Как именно работает проецирование файла в память?

При проецировании файла в память этому файлу сопоставляется регион адресного пространства процесса. Но что именно заносится в таблицу страниц процесса?


Ответы (1 шт):

Автор решения: Andrey Tabakov

Есть таблица страниц, но не менее важный аспект это Virtual Memory Area (VMA). Это та память, с которой обычно работают процессы в ОС.

  1. В таблице страниц:

    • Хранятся флаги (Present, Dirty, Accessed), тип отображения, а также физический адрес (если страница загружена в память).
    • Нет данных о файле (путь, смещение) — эти метаданные не помещаются в компактные записи таблицы страниц.
  2. В виртуальной памяти (VMA):

    • VMA — это объекты ядра, описывающие непрерывные диапазоны виртуальных адресов процесса. В них хранится:
      • Начальный и конечный виртуальные адреса региона.
      • Права доступа (read/write/execute).
      • Ссылку на файл (если регион связан с отображением файла).
      • Смещение (offset) в файле, соответствующее началу региона.
    • При обработке page fault ядро находит VMA, связанный с виртуальным адресом, и извлекает из него информацию о файле и смещении.

Алгоритм работы с файлом

  • Шаг 1: Процесс запрашивает отображение файла (например mmap, если говорим про linux).

    • Ядро создает VMA, сохраняя в нём путь к файлу, смещение, права доступа и диапазон виртуальных адресов.
    • В таблицу страниц добавляются записи для виртуальных адресов, но Present bit = 0 (в этот момент страницы ещё не загружены).
  • Шаг 2: При первом доступе к странице (чтение/запись):

    • Генерируется событие page fault, так как страница отсутствует в памяти (Present bit = 0).
    • Ядро находит VMA, соответствующий виртуальному адресу, извлекает из него файл и смещение в нём.
    • Загружает нужную страницу файла в физическую память.
    • Обновляет запись в таблице страниц: Present bit = 1, физический адрес, флаги доступа.

Важно ещё разделять виды отображения

  • Shared mapping: Изменения страницы Dirty bit = 1 могут синхронизироваться с файлом (в зависимости от настроек и политик ОС). Физическая страница может быть общей для нескольких процессов.

  • Private mapping (Copy-on-Write): При попытке записи генерируется новый page fault. ОС создает копию страницы для процесса, помечает ее как приватную, и обновляет таблицу страниц.


Почему таблица страниц и VMA разделены?

  • С точки зрения производительности: Таблица страниц оптимизирована для быстрого преобразования виртуальных адресов в физические. Хранение метаданных файлов в ней увеличило бы её размер, процесс чтения таблицы длился бы дольше, а также это дополнительная нагрузка на аппаратную составляющую. Иными словами, нам достаточно пробежаться по оглавлению.
  • С точки зрения гибкости: VMA позволяют ядру управлять сложными сценариями. Например, отображение одного файла в несколько регионов, Copy-on-Write, shared/private mapping.
→ Ссылка