#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);
これらの関数はもともとカーネル内部での使用を想定して設計されているが、 ユーザー空間からでも使用できる。
-O や -O2 などを指定してコンパイルしなければならない。 これらの関数はインラインマクロとして定義されており、 最適化を行わないと関数の展開が行われず、 リンクの時に「解決できない参照(unresolved reference)」が発生する。
ユーザー空間のアプリケーションが I/O ポートにアクセスすることを カーネルに教えるために ioperm(2) もしくは iopl(2) を使用すること。これを忘れるとアプリケーションはセグメンテーション違反 (segmentation fault) を受けとることになる。
[man1]
[man2]
[man3]
[man4]
[man5]
[man6]
[man7]
[man8]
[a]
[b]
[c]
[d]
[e]
[f]
[g]
[h]
[i]
[j]
[k]
[l]
[m]
[n]
[o]
[p]
[q]
[r]
[s]
[t]
[u]
[v]
[w]
[x]
[y]
[z]