PKEY_ALLOC - Linux手册页
Linux程序员手册 第2部分
更新日期: 2020-06-09
名称
pkey_alloc,pkey_free-分配或释放保护密钥
语法
#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)并将其传递给pkey_mprotect(2)。
pkey_alloc()标志保留供将来使用,并且当前必须始终将其指定为0。
pkey_alloc()access_rights参数可能包含零个或多个禁用操作:
- PKEY_DISABLE_ACCESS
- 禁用对返回的保护锁所覆盖的内存的所有数据访问。
- PKEY_DISABLE_WRITE
- 禁止对返回的保护锁所覆盖的内存进行写访问。
pkey_free()释放保护密钥,并使其可用于以后的分配。释放保护密钥后,它可能不再用于任何与保护密钥相关的操作。
应用程序不应在已由pkey_mprotect(2)分配给地址范围的任何保护密钥上调用pkey_free()。在这种情况下的行为是不确定的,并可能导致错误。
返回值
成功时,pkey_alloc()返回正保护密钥值。成功时,pkey_free()返回零。如果出错,则返回-1,并正确设置errno。
错误说明
- EINVAL
- pkey,标志或access_rights无效。
- ENOSPC
- (pkey_alloc())已分配了当前进程可用的所有保护密钥。可用的密钥数量是体系结构特定的和实现特定的,并且可以通过内核内部使用某些密钥来减少。 x86上的用户程序当前有15个键。
- 如果处理器或操作系统不支持保护键,也将返回此错误。应用程序应始终准备好处理该错误,因为应用程序控制范围之外的因素会减少可用pkey的数量。
版本
pkey_alloc()和pkey_free()已在内核4.9中添加到Linux;库支持在glibc 2.27中添加。
遵循规范
pkey_alloc()和pkey_free()系统调用是特定于Linux的。
备注
无论操作系统是否支持保护密钥,始终可以安全地调用pkey_alloc()。它可以代替检测pkey支持的任何其他机制使用,如果操作系统不提供pkey支持,则将失败并显示错误ENOSPC。
内核保证只为分配的保护密钥保留硬件权限寄存器(PKRU)的内容。每当取消分配密钥时(在第一次调用从pkey_alloc()返回该密钥之前或在通过pkey_free()释放该密钥之后),内核都可以对权限寄存器的各个部分进行任意更改,从而影响对该密钥的访问。
示例
参见pkeys(7)。
另外参见
pkey_mprotect(2),pkeys(7)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。