Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
ファイルシステムのマウント処理は、vfs do_mount関数が行う。この関数は、各個別ファイルシステムが用意しているread_superオペレーションを利用してスーパブロックを読み込む。それが成功すると、マウントテーブルに登録する(add_vfsmnt関数)
do_mount(デバイス名、マウントポイント, ファイルシステムタイプ, ...) : マウントするデバイスのスーパブロックを読み出す(read_super関数) (ファイルシステムタイプ毎に用意されているread_superオペレーションを実行) : マウントテーブルに登録(add_vfsmnt関数) get_sb_single
ext2ファイルシステムでは、read_superオペレーションは、下記ext2_read_super関数である。
ext2_read_super() バッファにスーパブロックを読み出す(bread関数) メモリ上のスーパブロックと上記バッファをリンク ブロックディスクリプタテーブルを全て読み込む(bread関数) 読み込んだブロックディスクリプタテーブルをメモリ上のスーパブロックにリンク iノードとブロックのビットマップ登録域の初期化 スーパブロックにオペレーション(ext2_sops)を登録 スーパブロックを使える状態にする(ext2_setup_super関数) ext2_setup_super() if (前回umountせずにシステムが落ちた || ファイルシステムにエラーが発生している || マウント回数が20回を超えた || 最後にfsckしてから6ヶ月以上経っている) "e2fsckコマンドを実行せよ" とメッセージ出力 スーパブロックのステータスフラグからVALIDビットを落す。 ◇スーパブロックの遅延書き込み要求(mark_buffer_dirty)
ファイルシステムのマウント解除処理は、vfs do_umount関数が行う。この処理では、スーパブロックに登録されているオペレーションを続けて三つ呼び出す。マウントテーブルからの登録抹消は、do_umount関数呼び出し側で行う。
rootファイルシステムのアンマウントに限り、リードオンリーで再マウントする(do_remount_sb関数)ようになっている。
do_umount(vfsmount構造体、 ...) if(rootファイルシステムなら) { リードオンリーで再マウントする(do_remount_sb関数) return; } スーパブロックのumount_beginオペレーション実行 このファイルシステム上のキャッシュをディスクに書き込む(fsync_dev関数) マウントの解除(remove_vfsmnt関数) スープブロック情報をディスクに書き戻す(kill_super関数) (スーパブロックのwrite_superオペレーション, スーパブロックのput_superオペレーション実行) このファイルシステム用のiノードの無効化(invalidate_inodes関数)
ext2ファイルシステムでは、umount_beginオペレーションはNULL、write_superオペレーションは、ext2_write_super関数、put_superオペレーションは、ext2_put_super関数が登録されている。
ext2_write_super(スーパブロック) スーパブロックの最終書き込み時間の更新 ◇スーパブロックが読み込まれているバッファの遅延書き込み要求(ext2_commit_super関数) スーパブロックのDirtyビットのクリア ext2_put_super(スーパブロック) スーパブロックのステータスフラグにVALIDを立てる ◇スーパブロックの遅延書き込み要求(mark_buffer_dirty関数) ブロックディスクリプタテーブルを読み込んでいたバッファ域を解放 iノードとブロックのビットマップを読み込んでいた領域を解放 スーパブロックを読み込んでいたバッファ域を解放
問題点など
(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:17:38, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members