Download presentation
Presentation is loading. Please wait.
Published byありさ かみいしづ Modified 約 7 年前
1
■パス検索 各種ファイルを操作するには、まずパス名をiノードに変換しなければならない。 以下にパス名をiノードに変換する関数の説明を行う。
vfs path_walk関数(v2.4で関数名がlookup_dentry関数から変更された)はパス名をトークンに分割し、 順番にディレクトリを辿って行く。 パス検索はまずディレクトリエントリキャッシュ上にから見つからないか検索し、そこに見つからない 場合は、物理的なデバイス上に探しに行く。 物理的なデバイス上から読みだしたディレクトリエントリ情報は即座にディレクトリエントリキャッシュに 登録する。 その操作を繰り返し、パス名の最後までたどり着いたところで、その時参照しているdentryの参照数を 1増やして返却する。
2
大雑把なアルゴリズムは以下の通り。 引数にわたされるnameidataには、dentry情報、マウント情報、各種フラグが設定されている。 path_walk(パス名、検索開始位置のnameidata) nameidataで渡されたdentryを探索起点とする。 for(;;) { パス名から'/'で区切られたトークンを取り出す if(トークンが".") 何もせつcontinue if(トークンが"..") { dentryの親子関係のリストから親ディレクトリのdentryを求める。 必要ならmountポイントを遡る(__follow_up関数) } ディレクトリエントリキャッシュから、トークンに対応する dentryを求める(cached_lookup関数) if(ディレクトリエントリキャッシュになかった) { 物理デバイスからトークンに対応するディレクトリエントリを見つけ、 dentryを作成、キャッシュに登録する(real_lookup関数) マウントポイントなら、マウント先のrootのdentryに変換する(__follow_down関数) シンボリックリンクファイルなら、シンボリックリンク先のdentryに変換(do_follow_link関数) if(パス名が終了) return 最後に求めたdentryをnameidataに登録
3
ディレクトリエントリキャッシュにヒットしない場合は、
real_lookup(トークン) dir = parent->d_inode; iノードをロック 再度d_lookup関数でdentryが登録されていないかチェック dentryの領域確保(d_alloc関数) ディレクトリファイルからトークン(ファイル名)に対応するiノードを求め、dentryとリンクする。 (各ファイルシステム固有の処理 iノードのlookupオペレーション) iノードのロック解除 return dentry
4
■パス検索 - その他の主なパス検索処理関数
■パス検索 - その他の主なパス検索処理関数 cached_lookup() d_lookup()を利用して、ディレクトリエントリキャッシュから 目的のdentryを検索する。 user_path_walk()、user_path_walk_link() ユーザ空間に置かれたパス名をカーネル空間に読み込んだ後、 patch_walk関数を 呼び出す。 (v2.2では、namei(), lnamei() という関数名だった) open_namei() 上記path_walkと異なる点が存在する。 ・createモードで呼ばれた場合、指定されたパスにファイルが 存在しないとき、 そのファイルを作成する。 (各ファイルシステム固有の処理 inode operationのcreate) ・ファイルトランケートモードで呼び出された場合、 対象ファイルのトランケート処理を行う (do_truncate関数)
5
■パス検索 - ext2ファイルシステムでのパス名検索
ファイルのパス名検索path_walk関数において、ディレクトリエントリキャッシュにヒットしなかった場合、 各ファイルシステムのパス検索関数を呼び出す。 ディレクトリiノードのlookupオペレーションが呼び出すことにより実現している。 ext2ファイルシステムの場合は、 ext2_lookup関数が呼び出される。 ディレクトリから目的のファイルを見つけだし、そのファイルのiノードをメモリ上に確保する。 ext2_lookup(親ディレクトリのiノード, 検索するファイルのdentry) ファイル名に対応するディレクトリエントリを探す(ext2_find_entry関数) ディレクトリエントリからiノード番号を取り出す ディレクトリ読み込みに利用したバッファの解放(brelse関数) iノード番号に対応するメモリiノードを確保(iget関数) ディレクトリエントリキャッシュに登録(d_add関数) また、ファイルのパス名検索の途中でシンボリックリンクファイルにヒットした場合、 do_follow_link関数を用いて、シンボリックリンク先のファイルのdentryに変換する。 ネスト数が32以上になるとエラー(ELOOP)
6
do_follow_link関数はシンボリックリンクファイルのiノードの follow_linkオペレーションを呼び出す
ことにより機能を実現している。 ext2ファイルシステムの場合は、 ext2_follow_link関数(パス名が短いとき) もしくは page_follow_link(パス名が長いとき)が呼び出される。 また、パス検索中に発生したfollow_linkオペレーション呼び出し回数を数えており、 回数が32以上になるとエラー(ELOOP)としている。 ext2_follow_link(シンボリックリンクファイルのdentry, リンクをたどるときにベース) パス名を取り出す。 vfs_follow_link(ベース, パス名) page_follow_link(シンボリックリンクファイルのdentry, リンクをたどるときにベース) ページキャッシュ経由でパス名の載ったブロックを読み込む 新しいパス名を元にパス検索開始(path_walk関数)
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.