ARCH_PRCTL - Linux手册页

时间:2019-08-20 17:58:35  来源:igfitidea点击:

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

名称

arch_prctl-设置特定于体系结构的线程状态

语法

#include <asm/prctl.h>
#include <sys/prctl.h>

int arch_prctl(int code, unsigned long addr);
int arch_prctl(int code, unsigned long *addr);

说明

arch_prctl()设置特定于体系结构的进程或线程状态。代码选择一个子函数并将参数addr传递给它;对于" set"操作,addr解释为无符号long,对于" get"操作,解释为unsigned long *。

x86和x86-64的子功能是:

ARCH_SET_CPUID(since Linux 4.12)
启用(addr!= 0)或禁用(addr == 0)当前线程的cpuid指令。该指令默认为启用状态。如果禁用,则执行任何cpuid指令都会生成SIGSEGV信号。此功能可用于模拟与基础硬件可能产生的结果不同的cpuid结果(例如,在半虚拟化设置中)。
ARCH_SET_CPUID设置在fork(2)和clone(2)之间保留,但在execve(2)上重置为默认值(即启用了cpuid)。
ARCH_GET_CPUID(since Linux 4.12)
作为系统调用的结果,返回由ARCH_SET_CPUID处理的标志的设置(1表示启用,0表示禁用)。 addr被忽略。
Subfunctions for x86-64 only are:
ARCH_SET_FS
将FS寄存器的64位基址设置为addr。
ARCH_GET_FS
返回addr指向的无符号长整数中当前线程FS寄存器的64位基值。
ARCH_SET_GS
将GS寄存器的64位基址设置为addr。
ARCH_GET_GS
返回addr指向的无符号长整数中当前线程的GS寄存器的64位基值。

返回值

成功时,arch_prctl()返回0;如果出错,则返回-1,并且将errno设置为指示错误。

错误说明

EFAULT
addr指向未映射的地址或在进程地址空间之外。
EINVAL
代码不是有效的子命令。
EPERM
addr在进程地址空间之外。
ENODEV
请求了ARCH_SET_CPUID,但是基础硬件不支持CPUID故障。

遵循规范

arch_prctl()是Linux / x86-64扩展,不应在打算移植的程序中使用。

备注

目前,只有Linux / x86-64支持64位程序的arch_prctl()。

当加载新的32位段选择器时,64位基数会更改。

在某些内核中禁用了ARCH_SET_GS。

用于64位段基础的上下文切换相当昂贵。作为一种优化,如果使用32位TLS基址,arch_prctl()可以使用真实的TLS条目,就好像已调用set_thread_area(2)一样,而不是直接操作段基址寄存器。可以使用带有MAP_32BIT标志的mmap(2)来分配地址空间的前2 GB中的内存。

由于上述优化,在同一线程中使用arch_prctl()和set_thread_area(2)很危险,因为它们可能会覆盖彼此的TLS条目。

从2.7版开始,glibc没有为arch_prctl()提供原型。您现在必须自行声明。这可能会在将来的glibc版本中修复。

线程库可能已经使用了FS。直接使用ARCH_SET_FS的程序很可能崩溃。

另外参见

mmap(2),modify_ldt(2),prctl(2),set_thread_area(2)

AMD X86-64程序员手册

出版信息

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