デバイスドライバのモデル

以下に、典型的なブロックデバイスドライバの構成を示す。(ここでは仮にxxxデバイスドライバとする)

一般に、ファイルオペレーションテーブルのread/write/fsyncオペレーションは、バッファキャッシュ経由の関数block_read,block_write,block_fsyncとするのが一般的である。(当然、自前でread/write用の関数を書けばrawI/Oも実現可能である)

blk_dev[]テーブルに登録したI/O起動関数のインターフェイスから再度呼び出してもらう。(下図の、xxx_request関数)

block_read,block_write,block_fsyncの要求に加え、ファイルシステムからのファイルやディレクトリの操作要求は全てバッファキャッシュ経由でアクセスされる。(ll_rw_block関数)これらの要求は、全てblk_dev[]テーブルに登録したI/O起動関数の呼び出しに一本化される。(下図の、xxx_request関数)

xxx_request関数は、blk_dev[]に登録された要求に従い、I/Oを発行する。この関数中では待ちに入らず、即関数呼び出しもとに戻る。しばらくしてI/Oが完了すると、ハードウェアからI/O完了割り込みが発生し、割り込みハンドラxxx_interrupt関数が起動される。この関数ではend_request関数を呼び出しI/Oの完了を上位モジュールに告げる。その後まだblk_dev[]テーブルに要求が溜まっていたら、その要求に対し再度I/Oを発行する。このループはblk_dev[]テーブルの要求が無くなるまで続けられる。

xxx_open関数は、デバイスファイルのopen処理時の他に、mount処理時に呼び出される。この関数は、デバイスを利用可能の状態にする。xxx_release関数はxxx_open関数の逆で、umount処理/デバイスのclose処理から呼び出される。またmount処理はリムーバブルデバイスに対応するため、check_xxx_change関数、xxx_revalidate関数を呼び出す。それぞれメディアの交換があったかいなかを調べる関数、再度デバイスを利用可能な状態にする関数、である。

xxx_ioctl関数は、そのドライバ(もしくはそのハードウェア)固有の処理であり、そのインターフェイスおよび処理内容はドライバ設計者にゆだねられている。

img57.gif

(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST
1