remap_file_pages - создаёт
нелинейное
файловое
отображение
Standard C library (
libc,
-lc)
#define _GNU_SOURCE /* Смотрите feature_test_macros(7) */
#include <sys/mman.h>
[[deprecated]] int remap_file_pages(void addr[.size], size_t size,
int prot, size_t pgoff, int flags);
Замечание:
данный
системный
вызов,
начиная с Linux 3.16,
устарел. В Linux 4.0
реализация
была
заменена
на более
медленную
эмуляцию
ядром. В
приложениях,
где он
используется,
нужно
применять
альтернативные
вызовы.
Данное
изменение
было
сделано
из-за
сложности
кода ядра
этого
системного
вызова, и
считается,
что им
почти
никто или
вообще
никто не
пользуется.
Какое-то
время он
использовался
в
приложениях
баз данных
на
32-разрядных
системах,
но этих
вариантов
использования
на
64-разрядных
системах
замечено
не было.
Системный
вызов
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,
игнорируются.
On success,
remap_file_pages() returns 0. On error, -1 is returned, and
errno is set to indicate the error.
- EINVAL
- Значение
addr не
ссылается
на
допустимое
отображение,
созданное
с флагом
MAP_SHARED.
- EINVAL
- Некорректное
значение в
addr, size, prot или
pgoff.
The
remap_file_pages() system call appeared in Linux 2.5.46; glibc
support was added in glibc 2.3.3.
Системный
вызов
remap_file_pages()
есть
только в Linux.
Начиная с Linux 2.6.23,
remap_file_pages()
создаёт
нелинейные
отображения
только для
файловых
систем в
оперативной
памяти,
таких как
tmpfs(5), hugetlbfs или ramfs.
Для
файловых
систем с
хранилищем
remap_file_pages() не
намного
эффективнее
чем
mmap(2), так
как
рассчитывает
адреса для
частей
файла.
getpagesize(2),
mmap(2),
mmap2(2),
mprotect(2),
mremap(2),
msync(2)
Русский
перевод
этой
страницы
руководства
был сделан
aereiae <
[email protected]>, Azamat Hackimov
<
[email protected]>, Dmitriy S. Seregin <
[email protected]>,
Katrin Kutepova <
[email protected]>, Lockal
<
[email protected]>, Yuri Kozlov <
[email protected]>,
Баринов
Владимир и
Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]