Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
ファイルシステムのマウント処理は、vfs do_mount関数が行う。この関数は、各個別ファイルシステムが用意しているread_superオペレーションを利用してスーパブロックを読み込む。それが成功すると、マウントテーブルに登録する(add_vfsmnt関数)
do_mount(デバイス名、マウントポイント, ファイルシステムタイプ, ...) マウントするデバイスのスーパブロックを読み出す(read_super関数) (ファイルシステムタイプ毎に用意されているread_superオペレーションを実行) マウントテーブルに登録(add_vfsmnt関数) ディレクトリエントリキャッシュ上でマウントポイントと マウントしたデバイスのrootをリンクする(d_mount関数)
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(デバイス名、 ...) スーパブロックを求める(get_super関数) スーパブロックのumount_beginオペレーション実行 このファイルシステム上のキャッシュをディスクに書き込む(fsync_dev関数) if(rootファイルシステムなら) { リードオンリーで再マウントする(do_remount_sb関数) return; } ディレクトリエントリキャッシュ上でマウントポイントと マウントしたデバイスのrootのリンクを解除(d_umount関数) スーパブロックのwrite_superオペレーション実行 スーパブロックのput_superオペレーション実行 このファイルシステム用のiノードの無効化(invalidate\_inodes関数)
ext2ファイルシステムでは、umount_beginオペレーションはNULL、write_superオペレーションは、ext2_write_super関数、put_superオペレーションは、ext2_put_super関数が登録されている。
ext2_write_super(スーパブロック) スーパブロックの最終書き込み時間の更新 ◇スーパブロックが読み込まれているバッファの遅延書き込み要求(mark_buffer_dirty関数) スーパブロックのDirtyビットのクリア ext2_put_super(スーパブロック) スーパブロックのステータスフラグにVALIDを立てる ブロックディスクリプタテーブルを読み込んでいたバッファ域を解放 iノードとブロックのビットマップを読み込んでいた領域を解放 スーパブロックを読み込んでいたバッファ域を解放
問題点など
(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:45:35, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members