新規記事投稿 フォロー記事投稿 記事のキャンセル
From: Akitaka HOSOMI <hosomi@ga2.so-net.ne.jp>
Subject: 当世ドライバ事情( ドライバは不遇の時代 )
Date: 1999/06/11 04:35:17
Reference: junge/00273

物心がついたころには、すでに遅く、ハードウェアは、こともあろうに、
デバイスという形で、ファイルシステムの中に組み込まれてしまってい
たのだった。

そもそも、んなモンの中に押し込めて、十派ひとからげで取りまとめて
しまうことに、かんなり無理があるにも関わらず、そこへ押し込んだ当
の連中は、統一された操作が美しい、などとヌかしておる。

ならば、あのとってつけたような I/O CONTROL とか言う機構は、何ぞ。
キョ〜〜ビのシステムでは、スマートとは言えんし、不恰好ではないか。
さらには、とても遅い。



近頃の OS では、 I/O CONTROL の手続きを経てハードウェアを制御す
ることは、カーネル空間とユーザ空間の行き来となってしまうため、か
なりのオーバーヘッドがある。

手持ちのマシンを使って Linux ( Kernel 2.0.36 )で試したところで
は、中身の無い ioctl コール( つまり、デバイスドライバ内では何も
せず、即、リターンする )で、約 1.7 マイクロ秒も、かかる。

これは、同一ユーザ空間内の C の空( カラ )関数コールが、 十数ナノ
秒で終わることを考えれば、100 倍近くの時間だ。


さらに、 I/O CONTROL を扱うにしても、入力や出力の区別があって、
然るべきであるのに、なんと ioctl() 関数自体には、その区別が提供
されていない。このあたりの融通が利くように自前でなんとかしようと
して、適当にメモリ管理をして ... 、などとモガくと、あっと言う間
に、 5 〜 6 マイクロ秒を消費してしまう。

こうなると、もう、論外、場外、国外退去。マイクロ秒オーダなんての
は、ハエが止まる。



同じ PC で、手持ちの PCI ボードから 1 バイトをポート入力すると、

      DOS    ( マシン語で直接入力 ) : 約 1.0 マイクロ秒
      Win-NT ( カーネル提供の関数 ) : 約 1.3 マイクロ秒
      Linux  ( インライン展開関数 ) : 約 1.4 マイクロ秒

といった感じで、一般に遅いとされるポートの入出力の処理においてさ
え、 I/O CONTROL は、充分にオーバーヘッドを生むと、考えられる。



 I/O CONTROL なんぞは、今となっては、先人の知恵というよりも、前
世紀の遺物、恐竜の化石。で、ユーザ空間に対して、何か、他の、新し
い、今風の機構は、提供されないものだろうか?

仮称 Direct Interrupt とか、Direct DMA とかさ。

 Win-NT にせよ、 Linux にせよ、ドライバ書きが、力づくで、メモリ
空間に風穴を開けるぐらいしか手が無い、では、キョ〜ビのカーネル様
としても、あまりに芸が無い、と思うんだけどなぁ。




以下は、参考まで。

      
 Linux の場合は、root 権限があれば、アプリ内で、直接ポート操作も
可能であるが、実測では、

      inb()  .... 約 1.46 〜 1.5  マイクロ秒
      outb() .... 約 1.5  〜 1.65 マイクロ秒

であり、カーネルモードのドライバよりも処理は遅くなる。


 Win-NT と Linux はカーネル空間内のドライバでポート入力を行った
ものだが、ハードウェアの仮想化( 抽象化 )が Linux よりも幾分進ん
でいると思われる NT の方が、なぜか、成績が良い、というのは、ちと、
興味深い。