PKEY_ALLOC(2) | Руководство программиста Linux | PKEY_ALLOC(2) |
pkey_alloc, pkey_free - выделяет или освобождает ключ защиты
#include <sys/mman.h>
int pkey_alloc(unsigned int flags, unsigned int access_rights); int pkey_free(int pkey);
Вызов pkey_alloc() выделяет ключ защиты (pkey), который можно передавать в pkey_mprotect(2).
Аргумент flags вызова pkey_alloc() зарезервирован для использования в будущем и в настоящее время должен равняться 0.
Аргумент access_rights вызова pkey_alloc() может содержать ноль или более запретительных операций:
Вызов pkey_free() освобождает ключ защиты и делает его доступным для будущего выделения. После освобождения ключа защиты он может больше не использоваться в операциях по защите ключом.
Приложение не должно вызывать pkey_free() с ключом защиты, который был назначен адресному диапазону с помощью pkey_mprotect(2) и который пока используется. Это вызывает непредсказуемое поведение и может привести к ошибке.
При успешном выполнении pkey_alloc() возвращается положительное значение ключа защиты. При успешном выполнении pkey_free() возвращается ноль. При ошибке возвращается -1 и errno присваивается соответствующее значение.
Вызовы pkey_alloc() и pkey_free() были добавлены в Linux 4.9; поддержка в glibc доступна с версии 2.27.
Системные вызовы pkey_alloc() и pkey_free() есть только в Linux.
Вызов pkey_alloc() всегда безопасен в независимости от поддержки ключей операционной системой. Его можно использовать как механизм определения поддержки pkey; он всегда просто возвращает ошибку ENOSPC, если операционная система не поддерживает pkey.
Ядро гарантирует, что содержимое аппаратных регистров прав (PKRU) будет сохранено только для выделенных ключей защиты. Пока ключ не выделен (до первого вызова, возвращающего этот ключ pkey_alloc(), или после его освобождения с помощью pkey_free()), ядро может вносить произвольные изменения в части регистров прав, относящихся к этому ключу.
Смотрите pkeys(7).
2019-03-06 | Linux |