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