[[PageNavi(internal22-navi)]]
{{{ comment
h2w-title:ブロック I/O起動インターフェイス
}}}
= ブロック I/O起動インターフェイス = #SECTION031220000000000000000
Linuxでは、ファイルシステムからのI/O要求をブロックデバイスのドライバへの要求に変換するモジュールが存在する。
ブロック型デバイスドライバは、以下のようなデータ構造を利用して呼び出される。各デバイス(メジャー番号)毎に、I/Oリクエストを繋ぐためのヘッダを用意している。ファイルシステムからI/O要求(ll_rw_block関数)があるとブロック I/O共通関数内に用意されているrequest構造体にファイルシステムから渡されたbufferを繋ぐ。I/O要求のリンクが完了したのち、ヘッダに登録されているデバイスドライバの起動関数を呼び出す。
[[Embed(internal22-images:img55.gif)]]
XXXXXXXXXXXXXXX
I/Oのスケジューリングを行う。各ドライバ内ではその必要性がない。
requestの構造体と、遅延してドライバが起動されることの説明SCSIの場合は、I/Oのスケジューリングは更に下のSCSIモジュールにゆだねてしまう。
{{{
XXX: ll_rw_block()以下の処理
隣り合ったセクタへのI/Oを一つにまとめている。
ブロックの順序をセクタ順に並び替えている。
ドライバを起動する。
}}}
I/O完了時の処理
{{{
デバイスからの終了通知 end_request関数。(昔のiodone関数相当)
bh->b_end_io()を呼び出し、バッファをFSヘ返却
このリクエストにバッファが無くなれば、
リクエスト自体も解放
}}}
リクエストをキューから外し、bh->b_end_io()を呼び出す。汎用関数を利用せず、同様の処理を自前で持っているものもある。
XXXXXXXXXXXXXXX
----
''(NIS)HirokazuTakahashi [[BR]]2000年06月11日 (日) 22時29分57秒 JST''1
[[PageNavi(internal22-navi)]]