
Linux上の仮想ファイルシステムで作業している間に、パス名がすでにディレクトリエントリキャッシュにディレクトリエントリとしてキャッシュされている場合、パス名を解決する方法に関する小さな問題に直面しました。
私は、解決されたパス名の将来のルックアップを高速化するために、さまざまなディレクトリエントリがハッシュテーブルに設定されていることを理解しています。今読んでいる本にはこういう言葉がある。
d_hash(ディレクトリエントリ、名前)
ハッシュ値を生成します。この関数は、dentryハッシュテーブルのファイルシステム固有のハッシュ関数です。 dentryパラメーターは、コンポーネントを含むディレクトリーを識別します。 nameパラメーターは、検索するパス名部分とハッシュ関数によって生成された値を含む構造体を指します。
...
ハッシュテーブルは dentry_hashtable 配列によって実装されます。各要素は、同じハッシュテーブル値をハッシュするディレクトリエントリのリストへのポインタです。アレイのサイズは通常、システムにインストールされているRAMの量によって異なります。デフォルトはRAMメガバイトあたり256項目です。 dentry オブジェクトの d_hash フィールドには、単一のハッシュ値に関連付けられたリストの隣接要素へのポインタが含まれています。ハッシュ関数は、ディレクトリの dentry オブジェクトとファイル名から値を生成します。Linuxカーネルについて学ぶ
「/home/test/file」パスがあるとします。 VFS は「/」、「home」、「test」、および「file」のディレクトリエントリを作成します。
これで、各デントリーに対応するハッシュ値がどのように計算されるか、VFSがハッシュテーブル内のキャッシュされたデントリーを介してパス名を見つける方法がわかりません。私が理解したように、VFSは次のことを行います。
- 「/」の dentry ハッシュとファイル名「home」を計算します。
- ハッシュテーブルで、「home」に対応する dentry のハッシュ値を探します。
- 「home」の dentry ハッシュ値と「test」というファイル名を計算します。
- ハッシュテーブルで、「test」に対応する dentry のハッシュ値を探します。
- 「test」の dentry とファイル名「file」のハッシュ値を計算します。
- ハッシュテーブルで、「file」に対応する dentry のハッシュ値を探します。
ただし、インターネット上の一部のサイトでは、VFSはフルパス名を一度だけハッシュし、結果のハッシュを使用して対応するdentryを検索するように聞こえます。
だから誰かが暗闇の中に光をもたらすことができれば良いでしょう。