在处理 Linux 的虚拟文件系统时,我遇到了一个小问题,即如果路径名已经作为目录项缓存在目录项缓存中,那么如何解析路径名。
我知道不同的目录项被组织在哈希表中,以加快将来对已解析路径名的查找速度。我现在正在读的书是这么说的:
d_hash(目录项,名称)
创建哈希值;该函数是用于 dentry 哈希表的文件系统特定的哈希函数。 dentry 参数标识包含该组件的目录。 name 参数指向一个结构,其中包含要查找的路径名部分和哈希函数生成的值。
...
哈希表是通过dentry_hashtable数组实现的。每个元素都是一个指向目录项列表的指针,这些目录项哈希到相同的哈希表值。阵列的大小通常取决于系统中安装的 RAM 量;默认值为每兆 RAM 256 个条目。 dentry 对象的 d_hash 字段包含指向与单个哈希值关联的列表中的相邻元素的指针。哈希函数从目录的 dentry 对象和文件名生成其值。了解 Linux 内核
假设我们有以下路径“/home/test/file”。现在,VFS 为“/”、“home”、“test”和“file”创建目录项。
现在我不明白每个dentry对应的hash值是如何计算的,以及VFS如何通过hash表中这些缓存的dentry查找路径名。根据我的理解,VFS 执行以下操作:
- 计算“/”和文件名“home”的dentry哈希值
- 在哈希表中查找“home”对应的dentry的哈希值
- 计算“home”和文件名“test”的 dentry 哈希值
- 在哈希表中查找“test”对应的dentry的哈希值
- 计算“test”和文件名“file”的 dentry 的哈希值
- 在哈希表中查找“文件”对应的 dentry 的哈希值
但在 Internet 上的某些网站上,听起来 VFS 仅一次对完整路径名进行哈希处理,然后使用生成的哈希值查找相应的 dentry。
因此,如果有人能为黑暗带来一些光明,那就太好了。