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-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
がプロセスのアドレス空間の外にある。
arch_prctl() は Linux/x86-64
拡張であり、移植性を意図したプログラムでは使うべきでない。
arch_prctl() は現在のところ
Linux/x86-64 上の 64
ビットプログラムでのみサポートされている。
新しい 32
ビットセグメントセレクタがロードされた場合、
64
ビットベースは変更される。
ARCH_SET_GS
が無効にされているカーネルもある。
64
ビットセグメントベースのコンテキストスイッチは、やや高価である。
LDT を
modify_ldt(2)
で設定してセグメントセレクタを使うか、
(カーネル 2.5 以降の)
set_thread_area(2)
システムコールを使うことにより、
32
ビットベースを設定するという高速な代替手段もある。
4GB
より大きなベースを設定したい場合にのみ、
arch_prctl() が必要である。
アドレス空間の最初の
2GB にあるメモリは、
mmap(2) に
MAP_32BIT
フラグを指定して割り当てることができる。
バージョン 2.7
時点では、glibc には
arch_prctl()
のプロトタイプがない。
今のところユーザは自分自身で宣言する必要がある。
これは将来の glibc
のバージョンで修正されるかもしれない。
FS
はスレッドライブラリで既に使われているかもしれない。
関連項目¶
mmap(2),
modify_ldt(2),
prctl(2),
set_thread_area(2)
AMD X86-64 Programmer's manual
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.65 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。