ARCH_PRCTL

Section: Linux Programmer's Manual (2)
Updated: 2020-04-11
Index Return to Main Contents
 

名前

arch_prctl - アーキテクチャー固有のスレッド状態を設定する  

書式

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

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

説明

arch_prctl() はアーキテクチャー固有のプロセス状態またはスレッド状態を設定する。 code は副機能を選択し、引き数 addr を副機能に渡す。 addr は、"set" 操作では unsigned long として、"get" 操作では unsigned long * として解釈される。

x86 と x86-64 の副機能は以下の通り:

ARCH_SET_CPUID (Linux 4.12 以降) カレントスレッドの cpuid 命令を有効 (addr != 0) または無効 (addr == 0) にする。 命令はデフォルトで有効にされている。 無効にされている場合、 cpuid 命令の実行では、代わりに SIGSEGV シグナルが生成される。 この機能は、(例えば、準仮想化設定において) 下層のハードウェアが生成する cpuid の結果が異なる場合に、 cpuid の結果をエミュレートするために使われる。
ARCH_SET_CPUID の設定は、 fork(2) と clone(2) では保存されるが、 execve(2) ではデフォルト (つまり cpuid が有効) にリセットされる。
ARCH_GET_CPUID (Linux 4.12 以降) システムコールの結果として、 ARCH_SET_CPUID で操作されたフラグの設定を返す (1 が有効で、0 が無効)。 addr は無視される。
x86-64 のみの副機能は以下の通り:
ARCH_SET_FS
FS レジスターの 64 ビットベースを addr に設定する。
ARCH_GET_FS
現在のスレッドの FS レジスターの 64 ビットベース値を、 addr が指す unsigned long の領域に格納する。
ARCH_SET_GS
GS レジスターの 64 ビットベースを addr に設定する。
ARCH_GET_GS
現在のスレッドの GS レジスターの 64 ビットベース値を、 addr が指す unsigned long の領域に格納する。
 

返り値

成功すると、 arch_prctl() は 0 を返す。エラーの場合、-1 を返し、 errno をエラーを示す値に設定する。  

エラー

EFAULT
addr がアンマップされたアドレスを指しているか、プロセスのアドレス空間の外にある。
EINVAL
code が有効なサブコマンドでない。
EPERM
addr がプロセスのアドレス空間の外にある。
ENODEV
ARCH_SET_CPUID がリクエストされたが、下層のハードウェアが CPUID フォールティングをサポートしていない。
 

準拠

arch_prctl() は Linux/x86-64 拡張であり、移植性を意図したプログラムでは使うべきでない。  

注意

arch_prctl() は現在のところ Linux/x86-64 上の 64 ビットプログラムでのみサポートされている。

新しい 32 ビットセグメントセレクタがロードされた場合、 64 ビットベースは変更される。

ARCH_SET_GS が無効にされているカーネルもある。

64 ビットセグメントベースのコンテキストスイッチは、やや高価である。 最適化として、32 ビット TLS ベースアドレスが使われた場合、 arch_prctl() は、セグメントベースレジスタを直接操作する代わりに、 set_thread_area(2) が呼ばれたかのように、実際の TLS エントリを使う可能性がある。 アドレス空間の最初の 2GB にあるメモリーは、 mmap(2) に MAP_32BIT フラグを指定して割り当てることができる。

前述の最適化のため、 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 Programmer's manual  

この文書について

この man ページは Linux man-pages プロジェクトのリリース 5.07 の一部である。 プロジェクトの説明、バグ報告に関する情報、このページの最新版は、 http://www.kernel.org/doc/man-pages/ に書かれている。


 

Index

名前
書式
説明
返り値
エラー
準拠
注意
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 17:33:15 GMT, January 01, 2021