IOPERM(2) |
Linux Programmer's Manual |
IOPERM(2) |
名前
ioperm -ポートの入出力許可を設定する
書式
#include <unistd.h> /* for libc5 */
#include <sys/io.h> /* for glibc */
int ioperm(unsigned long
from
, unsigned long
num
, int
turn_on
);
説明
ioperm() は、引き数
from の I/O ポートアドレスから
num ビット分の領域に対する、呼び出し元スレッドのアクセス許可ビットを設定する。
turn_on が 0 以外の場合、指定されたビットに対応する許可が有効になる。
turn_on が 0 以外の場合、呼び出し元プロセスは特権 (
CAP_SYS_RAWIO) を持っていなければならない。
Linux 2.6.8 より前のバージョンでは、この方法で設定できるのは 0x3ff 番地までの I/Oポートに限られていた。これよりも大きなアドレスのポートに対しては
iopl(2) 関数を使わなければならなかった。Linux 2.6.8 以降では、65,536 個の I/O ポートを指定できる。
アクセス権は
fork(2) で作成された子プロセスには継承されない。子プロセスでは、
fork(2) の後で必要なアクセス権を有効にしなければならない。
execve(2) の前後でアクセス権は保存される。この機能は非特権プログラムにポートへのアクセス権を与えるのに使用できる。
このシステムコールはほとんど i386 アーキテクチャのためだけのものである。その他の多くのアーキテクチャでは存在しないか、常にエラーを返す。
返り値
成功した場合は 0 が返される。エラーの場合は-1 が返され、
errno が適切に設定される。
エラー
-
EINVAL
-
from または
num の値が不正である。
-
EIO
-
(PowerPC で) このシステムコールはサポートしていない。
-
ENOMEM
-
メモリ不足。
-
EPERM
-
呼び出し元スレッドに十分な権限がなかった。
準拠
ioperm() は Linux 特有の関数であり、移植を意図したプログラムで使用してはならない。
注意
/proc/ioports ファイルには、現在このシステムに割り当てられている I/O ポートが表示される。
libc5 ではシステムコールとして扱い
<unistd.h> にプロトタイプが存在している。 glibc1 にはプロトタイプは存在しない。 glibc2 は
<sys/io.h> と
<sys/perm.h> の両方にプロトタイプを持っている。後者は i386 のみで利用可能なので、使用すべきではない。
関連項目
iopl(2),
outb(2),
capabilities(7)
この文書について
この man ページは Linux
man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。