Show page source of internal24-164-ブロック I/O起動インターフェイス #25058

[[PageNavi(internal24-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(internal24-images:img59.gif)]]
 

I/O要求(request)をblk_devにリンクするとき、I/Oブロック順に繋ぎ直しI/Oのスケジューリングを行う。各ドライバ内ではその必要性がない。また、連続した領域に対するI/Oはここで一つのI/Oにマージされる。

{{{
 ll_rw_block()の処理
       デバイス毎にようされたキューにI/O要求を溜める。
       すぐには、ドライバの起動は行わない。
         - 隣り合ったセクタへのI/Oを一つにまとめている。
         - ブロックの順序をセクタ順に並び替える。
}}}

{{{
   run\_task\_queue(&tq_disk)の処理
       ll_rw_block()でキューに溜められていたI/O要求を解放し、
       デバイスドライバの起動を行う。
       デバイスドライバは、キューにI/O要求のある間、どんどん
       要求をとりだし実際のI/O処理を続る。
}}}

{{{
  I/O完了時の処理
	デバイスからの終了通知 end_request関数。(伝統UNIXのiodone関数相当)
	bh->b_end_io()を呼び出し、バッファをファイルシステムヘ返却
	このリクエストにバッファが無くなれば、
	リクエスト自体も解放
}}}

リクエストをキューから外し、bh->b_end_io()を呼び出す。汎用関数を利用せず、同様の処理を自前で持っているものもある。

----

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

[[PageNavi(internal24-navi)]]