ALLOC_HUGEPAGES(2)

ИМЯ
alloc_hugepages, free_hugepages - выделяет или освобождает огромные страницы

ОБЗОР
void *alloc_hugepages(int key, void *addr, size_t len,
                      int prot, int flag);

int free_hugepages(void *addr);

ОПИСАНИЕ
Системные вызовы alloc_hugepages() и free_hugepages() появились в Linux 2.5.36 и удалены в 2.5.54. Они существовали только на архитектурах i386 и ia64 (при сборке с параметром CONFIG_HUGETLB_PAGE). В Linux 2.4.20 такие номера системных вызовов остались, но сами вызовы завершаются с ошибкой ENOSYS.

На i386 аппаратура управления памятью умеет работать с обычными страницами (4 КиБ) и огромными страницами (2 или 4 МиБ). Подобно этому, ia64 умеет работать с огромными страницами разных размеров. Эти системные вызовы служат для отображения огромных страниц в память процесса или её освобождения. Огромные страницы блокируются в памяти и не могут быть вытеснены в пространство подкачки.

Аргумент key служит идентификатором. При нулевом значении страницы считаются частными и не наследуются потомками. При положительном значении страницы совместно используются несколькими приложениями посредством одинакового key и наследуются процессами-потомками.

Аргумент addr в free_hugepages() указывает какую страницу нужно освободить: его значением является результат вызова alloc_hugepages(). (Память, на самом деле, освобождается только когда все пользователи её освободят.) Аргумент addr в alloc_hugepages() — это подсказка, которой ядро может и не воспользоваться. Адреса должны быть выровнены соответствующим образом.

Аргумент len задаёт длину требуемого сегмент. Он должен быть кратен размеру огромной страницы.

Аргумент prot определяет тип защиты сегмента памяти. Может быть указано одно из значений: PROT_READ, PROT_WRITE, PROT_EXEC.

Аргумент flag игнорируется, если key не является положительным. В этом случае, если flag — IPC_CREAT, то создаётся новый сегмент огромной страницы, если не существует ни один из указанных идентификаторов. Если флаг не задан, то возвращается ENOENT, если не существует сегмента с заданным идентификатором.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении alloc_hugepages() возвращает выделенный виртуальный адрес, а free_hugepages() возвращает ноль. При ошибке возвращается -1, а errno устанавливается соответствующим образом.

ОШИБКИ

ENOSYS
    Системный вызов не поддерживается данным ядром.

ФАЙЛЫ
/proc/sys/vm/nr_hugepages Количество настроенных страниц hugetlb. Доступен для чтения и записи.

/proc/meminfo Выдаёт информацию о числе настроенных страниц hugetlb и их размере в трёх переменных: HugePages_Total, HugePages_Free, Hugepagesize.

СООТВЕТСТВИЕ СТАНДАРТАМ
Эти вызовы есть только в Linux для процессоров Intel и не должны использоваться в переносимых программах.

ЗАМЕЧАНИЯ
Данные системные вызовы были удалены; они существуют только в ядрах Linux версий с 2.5.36 по 2.5.54. Вместо них теперь можно использовать файловую систему hugetlbfs. Память, поддерживаемая огромными страницами (если есть поддержка в ЦП), получается с помощью mmap(2) в отображаемые файлы этой виртуальной файловой системе.

Максимальное число огромных страниц можно задать в параметре загрузки ядра hugepages=.