Как обеспечить функцию расширения при записи для файлов с отображением памяти в Linux?

Я работаю над переносом некоторого кода из AIX в Linux. Части кода используют системный вызов shmat () для создания новых файлов. При использовании с SHM_MAP в режиме с возможностью записи можно расширить файл за пределы его исходной длины (в моем случае - нуля):

Когда файл отображается на сегмент, на файл ссылается доступ к сегменту. Система подкачки памяти автоматически выполняет физические операции ввода-вывода. Ссылки за пределами конца файла вызывают расширение файла с приращением размера страницы. Файл не может быть расширен за границу следующего сегмента.

(«Сегмент» в AIX - это блок адресного пространства размером 256 МБ, а «страница» обычно составляет 4 КБ.)

Что бы я сделал например, в Linux нужно сделать следующее:

  • Зарезервируйте большой кусок адресного пространства (он не должен быть таким большим, как 256 МБ, это не такие уж большие файлы)
  • Установить увеличьте биты защиты страницы, чтобы при первом обращении к странице, которая не была затронута до этого, генерировался segfault
  • При ошибке страницы сбросьте бит «вызвать ошибку страницы» и выделите выделенную память для страницы, разрешение записи (или чтения), которая вызвала сбой страницы
  • После закрытия области общей памяти, записать измененные страницы в файл

Я знаю, что могу сделать это в Windows с помощью VirtualProtect , бит защиты памяти PAGE_GUARD и структурированный обработчик исключений . Каков соответствующий метод в Linux, чтобы сделать то же самое? Может быть, есть лучший способ реализовать эту функцию расширения при записи в Linux?

Я уже рассмотрел:

  • с использованием mmap () с некоторым фиксированным большим размером, но я не могу сказать, какая часть файла была записана кодом приложения
  • , выделяющим анонимную разделяемую область памяти большого размера, но опять же я не могу сказать, какая часть области была записана
  • mmap () сам по себе, похоже, не предоставляет никаких средств для увеличения длины файла поддержки

Естественно, я хотел бы сделать это с минимальными изменениями в коде приложения.

5
задан Dialecticus 13 January 2012 в 09:25
поделиться