另外参见

pkey_mprotect(2),pkeys(7)

名称

pkey_alloc,pkey_free-分配或释放保护密钥

遵循规范

pkey_alloc()和pkey_free()系统调用是特定于Linux的。

备注

无论操作系统是否支持保护密钥,始终可以安全地调用pkey_alloc()。它可以代替检测pkey支持的任何其他机制使用,如果操作系统不提供pkey支持,则将失败并显示错误ENOSPC。

内核保证只为分配的保护密钥保留硬件权限寄存器(PKRU)的内容。每当取消分配密钥时(在第一次调用从pkey_alloc()返回该密钥之前或在通过pkey_free()释放该密钥之后),内核都可以对权限寄存器的各个部分进行任意更改,从而影响对该密钥的访问。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

错误说明

EINVAL
pkey,标志或access_rights无效。
ENOSPC
(pkey_alloc())已分配了当前进程可用的所有保护密钥。可用的密钥数量是体系结构特定的和实现特定的,并且可以通过内核内部使用某些密钥来减少。 x86上的用户程序当前有15个键。
如果处理器或操作系统不支持保护键,也将返回此错误。应用程序应始终准备好处理该错误,因为应用程序控制范围之外的因素会减少可用pkey的数量。
PKEY_ALLOC - Linux手册页

Linux程序员手册 第2部分
更新日期: 2020-06-09

示例

参见pkeys(7)。

语法

#define _GNU_SOURCE             /* See feature_test_macros(7) */
#include <sys/mman.h>

int pkey_alloc(unsigned int flags, unsigned int access_rights);
int pkey_free(int pkey);

返回值

成功时,pkey_alloc()返回正保护密钥值。成功时,pkey_free()返回零。如果出错,则返回-1,并正确设置errno。

版本

pkey_alloc()和pkey_free()已在内核4.9中添加到Linux;库支持在glibc 2.27中添加。

说明

pkey_alloc()分配保护密钥(pkey)并将其传递给pkey_mprotect(2)。

pkey_alloc()标志保留供将来使用,并且当前必须始终将其指定为0。

pkey_alloc()access_rights参数可能包含零个或多个禁用操作:

PKEY_DISABLE_ACCESS
禁用对返回的保护锁所覆盖的内存的所有数据访问。
PKEY_DISABLE_WRITE
禁止对返回的保护锁所覆盖的内存进行写访问。

pkey_free()释放保护密钥,并使其可用于以后的分配。释放保护密钥后,它可能不再用于任何与保护密钥相关的操作。

应用程序不应在已由pkey_mprotect(2)分配给地址范围的任何保护密钥上调用pkey_free()。在这种情况下的行为是不确定的,并可能导致错误。

日期:2019-08-20 17:59:07 来源:oir作者:oir