PCIの情報はというと
デバイスドライバを作る利点もいろいろとありますが、ここでは、作らずに済む方法を示します。
デバイスドライバを作らなければならないのは
ただし、これらを行うためには root の権限が必要です。
つまり、実行時に root になるか、実行ファイルのオーナを root にした上で
などの場合です。
また、ポーリングする場合にも、いちいちユーザ空間のプロセスを切り替えるより、カーネル内のタイマ割り込み時に実行したほうが負荷も少なく、確実です。
このような場合にはドライバを必要とします。
しかし、ドライバのハードウェアとのやり取りをする部分の大部分はドライバにすることなく作成できます。
つまり、やっかいな部分は予め普通のプログラムでつくってデバッグしておき、最後にデバイスドライバの皮をかぶせる、という開発が可能で、楽になります。
後者はI/O空間全体に対して、一括して禁止解除します。
そのため、ポートを間違ったときにはそのままアクセスされ、注意が必要です(中には読むだけでハングアップするポートもあります)。
この命令は具体的にはi386のI/Oアクセスの許可判断となるフラグレジスタのIOPLビットの操作ですが
(
なお、付随する特権として、ハードウェア割り込みの許可不許可(sti,cli) が使えるようになってしまいますが、うかつに使うとOSごと止りかねないので、使わない方がいいでしょう。
先ほどのプログラムを少しいじってみました。
ひとつの方法は、Linuxのインストールなどでもよくやる、Windowsのデバイスマネージャなどで調べる、というものです。
ですが、Linux がすでに動作しているなら、
さて、ここに Unknown なデバイスがあります。
このボードは私がデバイスドライバを書く練習台にもしたアドテックシステムサイエンス社の48ビットパラレルI/Oボード aPCI-P54です。
マニュアルによると、16バイト分のI/Oアドレスを通して使用するのですが、なぜか、メモリ領域が1つにI/O領域が2つあります。
試しにプログラムをつくって、動作を確認したところ、0x14f0が使用すべきアドレスでした(のこりはPCIバスとのインターフェイスのLSIが使う領域とのことです)。
このように、
ちなみに、"Bus", "device", "function" はデバイスドライバでPCIデバイスの検出を行うときに使用する、物理的にどこにボードが挿さっているかを表す数字です。
ただ、この
これらの方法をつかうと、ちょっと制御をしてみたりするときに、ドライバがいるか、というと要らない可能性が高いと言えそうです。 そのほか、今後のことも考えてドライバをつくる、割り込みを使いたいなどの場合にも、これらの方法で事前にあらからテストした上で、ドライバに取り組んだりする場合にも、これらの方法が役立つことでしょう。 カーネルにドライバを組み込んで恐い思いをするのは、なるべく最低限にとどめたいので。