remap_file_pages - создаёт нелинейное файловое отображение
remap_file_pages(2)
создаёт нелинейное файловое отображение
ОБЗОР
#define _GNU_SOURCE /* Смотрите feature_test_macros(7) */
#include <sys/mman.h>
int remap_file_pages(void *addr, size_t size, int prot,
size_t pgoff, int flags);
ОПИСАНИЕ
Замечание: данный системный вызов (начиная с Linux 3.16) устарел и вскоре
будет заменён на более медленную эмуляцию ядром. В приложениях, где он
используется, нужно применять альтернативные вызовы.
Системный вызов remap_file_pages() используется для создания нелинейного
отображения, то есть отображения, в котором страницы файла отображаются в
память непоследовательно. Преимущество использования remap_file_pages()
по сравнению с повторением вызовов mmap(2) в том, что первый не требует
от ядра создания дополнительных структур данных VMA (областей виртуальной
памяти).
Для создания нелинейного отображения выполните следующее:
1.
Создайте отображение (пока линейное) с помощью
mmap(2). Данное
отображение должно создаваться с флагом
MAP_SHARED.
2.
Выполните переупорядочивание соответствия между страницами отображения и
страницами файла с помощью одного или нескольких вызовов
remap_file_pages(). Возможно отображать одну страницу файла в несколько
мест отображаемой области.
В аргументах pgoff и size указывается область файла, которая будет
перенесёна в отображение: в pgoff задаётся смещение в файле, измеряемое
в размерах системных страниц; в size задаётся длина области в байтах.
Аргумент addr предназначен для двух целей. Во-первых, им определяется
отображение, чьи страницы мы хотим перенести. То есть в addr должен быть
указан адрес в области, которая была ранее отображена с помощью вызова
mmap(2). Во-вторых, в addr указывается адрес, по которому должны быть
помещены файловые страницы, заданные pgoff и size.
Значения, указанные в addr и size, должны быть кратны размеру
системной страницы. Если это не так, то ядро округляет оба значения в
меньшую сторону до ближайшего числа, кратного размеру страницы.
Значение аргумента prot должно быть 0.
Аргумент flags предназначен для того же, что и в mmap(2), но все
флаги, кроме MAP_NONBLOCK, игнорируются.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При удачном выполнении
remap_file_pages() возвращается 0. При ошибке
возвращается -1, а значение
errno устанавливается соответствующим
образом.
ОШИБКИ
EINVAL
Значение addr не ссылается на допустимое отображение, созданное с флагом
MAP_SHARED.
EINVAL
Некорректное значение в addr, size, prot или pgoff.
ВЕРСИИ
Системный вызов
remap_file_pages() появился в Linux 2.5.46; поддержка в
glibc началась с версии 2.3.3.
СООТВЕТСТВИЕ СТАНДАРТАМ
Системный вызов
remap_file_pages() есть только в Linux.
ЗАМЕЧАНИЯ
Начиная с Linux 2.6.23,
remap_file_pages() создаёт нелинейные отображения
только для файловых систем в оперативной памяти, таких как tmpfs, hugetlbfs
или ramfs. Для файловых систем с хранилищем
remap_file_pages() не намного
эффективнее чем
mmap(2), так как рассчитывает адреса для частей файла.