table of contents
REMAP_FILE_PAGES(2) | Руководство программиста Linux | REMAP_FILE_PAGES(2) |
ИМЯ¶
remap_file_pages - создаёт нелинейное файловое отображение
ОБЗОР¶
#define _GNU_SOURCE /* Смотрите feature_test_macros(7) */ #include <sys/mman.h> int remap_file_pages(void *addr, size_t size, int prot, ssize_t pgoff, int flags);
ОПИСАНИЕ¶
Системный вызов 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 устанавливается соответствующим образом.
ОШИБКИ¶
ВЕРСИИ¶
Системный вызов remap_file_pages() появился в Linux 2.5.46; поддержка в glibc началась с версии 2.3.3.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
Системный вызов remap_file_pages() есть только в Linux.
СМОТРИТЕ ТАКЖЕ¶
getpagesize(2), mmap(2), mmap2(2), mprotect(2), mremap(2), msync(2)
2008-04-22 | Linux |