iopl - I/O
特権レベルを変更する
#include <sys/io.h>
int iopl(int level);
iopl()
は呼び出し元のプロセスの
I/O 特権レベルを
level
で指定した値に変更する。
この関数は 8514 互換の X
サーバを Linux
で動作させるために必要である。
なぜならこの X
サーバは 65536 個の I/O
ポート全てへのアクセスを要求するので
ioperm(2)
関数では不十分だからである。
より高い I/O
特権レベルでの動作をさせることによって
I/O
ポートアクセスの制限を解除することに加えて、プロセスが割り込みを
無効にすることもできるようになる。この機能は時としてシステムの破壊を
もたらすので勧められない。
fork(2) や
exec(2)
を行った場合、特権は継承される。
通常のプロセスの I/O
特権レベルは 0
である。
このシステムコールはほとんど
i386
アーキテクチャのためだけのものである。
その他の多くのアーキテクチャでは存在しないか、常にエラーを返す。
返り値¶
成功した場合は 0
が返される。エラーの場合は
-1 が返され、
errno
が適切に設定される。
エラー¶
- EINVAL
- 引き数 level が 3
より大きい。
- ENOSYS
- このシステムコールは実装されていない。
- EPERM
- 呼び出し元プロセスに
iopl()
を呼び出すのに十分な権限がなかった。
iopl() を呼び出すには
CAP_SYS_RAWIO
ケーパビリティが必要である。
iopl() は Linux
特有の関数であり、移植を意図したプログラムで
使用してはならない。
libc5
ではシステムコールとして扱い
<unistd.h>
にプロトタイプが存在している。
glibc1
にはプロトタイプは存在していない。
glibc2 は
<sys/io.h> と
<sys/perm.h>
の両方にプロトタイプを持っている。
後者は i386
のみで利用可能なので、使用すべきではない。
関連項目¶
ioperm(2),
capabilities(7)
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.41 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。