outb, outw, outl, outsb, outsw, outsl, inb, inw, inl, insb, insw, insl, outb_p,
outw_p, outl_p, inb_p, inw_p, inl_p -
ポート入出力
#include <sys/io.h>
unsigned char inb(unsigned short port);
unsigned char inb_p(unsigned short port);
unsigned short inw(unsigned short port);
unsigned short inw_p(unsigned short port);
unsigned int inl(unsigned short port);
unsigned int inl_p(unsigned short port);
void outb(unsigned char value, unsigned short port);
void outb_p(unsigned char value, unsigned short port);
void outw(unsigned short value, unsigned short port);
void outw_p(unsigned short value, unsigned short port);
void outl(unsigned int value, unsigned short port);
void outl_p(unsigned int value, unsigned short port);
void insb(unsigned short port, void *addr,
unsigned long count);
void insw(unsigned short port, void *addr,
unsigned long count);
void insl(unsigned short port, void *addr,
unsigned long count);
void outsb(unsigned short port, const void *addr,
unsigned long count);
void outsw(unsigned short port, const void *addr,
unsigned long count);
void outsl(unsigned short port, const void *addr,
unsigned long count);
この一連の関数はポートに対する低レベルの入出力に使用する。
out*
関数はポート出力、in*
関数はポート入力を行う。
語尾に b
がついている関数はバイト単位、w
がついている関数はワード単位である。
_p がついている関数は
I/O
が終了するまで待つ。
これらの関数はもともとカーネル内部での使用を想定して設計されているが、
ユーザー空間からでも使用できる。
-O や
-O2
などを指定してコンパイルしなければならない。
これらの関数はインラインマクロとして定義されており、
最適化を行わないと関数の展開が行われず、
リンクの時に「解決できない参照(unresolved
reference)」が発生する。
ユーザー空間のアプリケーションが
I/O
ポートにアクセスすることを
カーネルに教えるために
ioperm(2) もしくは
iopl(2)
を使用すること。これを忘れるとアプリケーションはセグメンテーション違反
(segmentation fault)
を受けとることになる。
outb()
とその仲間はハードウェア特有である。
value
引数が最初に渡され、
port
引数が二番目に渡される。
この順序はほとんどの
DOS
での実装とは逆である。
ioperm(2),
iopl(2)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。