書式
#include <sys/io.h>int iopl(int level);
説明
iopl() は呼び出し元のプロセスの I/O 特権レベルを level の下位 2 ビットで指定した値に変更する。この関数は 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() を呼び出すのに十分な権限がなかった。 I/O 特権レベルを現在の値より上げるには CAP_SYS_RAWIO ケーパビリティが必要である。
