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

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

ファイルオペレーションテーブルのread/write/fsyncオペレーションは、バッファキャッシュ経由の関数block_read,block_write,block_fsyncが登録されている。これらの関数は、blk_dev[]テーブルに登録したI/O起動関数のインターフェイスから再度ドライバ呼び出しを行う。(下図の、baa_request関数)

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

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

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

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

img62.gif

(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1