8. トラブルシュート

Q1.

ポートをアクセスした時に segmentation faults が起きてしまいます。

A1.

プログラムが root 特権を持っていないか、なんらかの理由で ioperm() を呼び出した時に失敗しているので しょう。 ioperm() の返り値を調べてみてください。 それと本当に ioperm() で許可を得たポートに アクセスしているかどうかも調べてみてください。 (Q3も参考にしてください。) ディレイ付きマクロ (inb_p(), outb_p() などなど)を使っているなら、 ioperm() でポート 0x80 のアクセス許可も忘れ ずに取得してください。

Q2.

in*() とか out*() とかの関数がどこにもみつかりません。gcc が undefined references とか文句 を言ってきます。

A2.

コンパイルの時に最適化をオン (-O) にしなかったのでは? その結果、gcc は asm/io.h の中にあるマクロ を解決することができなかったのです。 それとも、#include <asm/io.h> を忘れてませんか?

Q3.

out*() を実行してもなにもおこらない、 またはなんか変なのですが。

A3.

パラメータの順番をチェックして下さい。outb(value, port) という順番です。 MS-DOS でおなじみの outportb(port,value) とは逆です。

Q4.

標準の RS-232 機器、パラレルプリンター、ジョイスティック といったものを制御したいのですが...

A4.

たぶん既にあるドライバ( Linux のカーネルとか X サーバとかそういったものに くっついてくるやつのことです。)を使った方がいいです。 そういうドライバはすごく汎用性が高くて、ちょっと規格外の機器なんかも大 抵動きます。 そこらへんの文書へのポインターとして、上で書いた標準ポートの情報を参考 にしてください。