Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
以下にその大雑把なアルゴリズムを示す。アルゴリズム中に付いている◆印は同期書き込みを、◇印は遅延書き込みを表す。
ext2_getblk(iノード、オフセット, ...) if(ファイルオフセットが直接ブロックの範囲) データブロックのバッファ = inode_getblk(iノード, iノード内のブロック登録エントリ番号); return データブロックのバッファ; if(ファイルオフセットが一段間接ブロックの範囲) { 間接ブロックのバッファ = inode_getblk(iノード, iノード内の間接ブロックの登録エントリ番号); データブロックのバッファ = block_getblk(iノード, 間接ブロックのバッファ, 間接ブロック内のデータブロック登録エントリ番号); return データブロックのバッファ; } if(ファイルオフセットが二段間接ブロックの範囲) { 一段目の間接ブロックのバッファ = inode_getblk(iノード, iノード内の一段目の間接ブロックの登録エントリ番号); 二段目の間接ブロックのバッファ = block_getblk(iノード, 一段目の間接ブロックのバッファ, 一段目の間接ブロック内の二段目の間接ブロック登録エントリ番号); データブロックのバッファ = block_getblk(iノード, 二段目の間接ブロックのバッファ, 二段目の間接ブロック内のデータブロック登録エントリ番号); return データブロックのバッファ; } 一段目の間接ブロックのバッファ = inode_getblk(iノード, iノード内の一段目の間接ブロックの登録エントリ番号); 二段目の間接ブロックのバッファ = block_getblk(iノード, 一段目の間接ブロックのバッファ, 一段目の間接ブロック内の二段目の間接ブロック登録エントリ番号); 三段目の間接ブロックのバッファ = block_getblk(iノード, 二段目の間接ブロックのバッファ, 二段目の間接ブロック内の三段目の間接ブロック登録エントリ番号); データブロックのバッファ = block_getblk(iノード, 三段目の間接ブロックのバッファ, 三段目の間接ブロック内のデータブロック登録エントリ番号); return データブロックのバッファ;
inode_getblk関数は、直接iノードに継っているブロック(直接データブロック、および一段目の間接ブロック)に対応するバッファを獲得する関数である。もし指定されたブロックがiノードに登録されていなければ、フリーブロックを見つけて来てiノードに登録する。
inode_getblk(iノード、iノード内オフセット) if(iノード内オフセットで指定された箇所にブロックが登録されている) { そのブロックに対応したバッファを確保(getblk関数) return バッファ; } if(自動的にブロック割当をしないなら) return; 空きブロックを確保(ext2_alloc_block関数) 確保したブロックに対応するバッファを確保(getblk関数) iノードにこの確保したブロックを登録 iノードの登録ブロック数情報更新(i_blocks) if(SYNC属性 または、同期モードopen?) { ◆iノードをディスクに書き込む(ext2_sync_inode関数) } else { ◇iノードの遅延書き込み要求を出す(mark_inode_dirty関数) } return 確保したブロックのバッファ;
block_getblk(iノード, 間接ブロックのバッファ, 間接ブロック内オフセット) if(間接ブロック内オフセットで指定された箇所にブロックが登録されている) { そのブロックに対応したバッファを確保(getblk関数) return バッファ; } if(自動的にブロック割当をしないなら) return; 空きブロックを確保(ext2_alloc_block関数) 確保したブロックに対応するバッファを確保(getblk関数) 間接ブロックに確保したブロックを登録 ◇間接ブロックの遅延書き込み要求をだす(mark_buffer_dirty関数) if(SYNC属性 または、同期モードopen?) { ◆間接ブロックをディスクに書き込む(ll_rw_block関数,wait_on_buffer関数) } iノードの登録ブロック数情報更新(i_blocks) ◇iノードの遅延書き込み要求を出す(mark_inode_dirty関数) 間接ブロックのバッファの解放(brelse関数) return 確保したブロックのバッファ
下図は、ちょうど二段間接ブロックが作成される時の、データの更新順を表したものである。◆の後ろに書かれた番号が更新順を表している。
問題点など
(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:45:55, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members