【Linux】路径查找-path lookup

打印 上一主题 下一主题

主题 889|帖子 889|积分 2667

在Linux VFS(虚拟文件系统)中,路径查找(Path Lookup) 是最常见的操作之一。路径查找的重要作用是将用户空间中的路径名转换为内核中对应的dentry对象,为系统调用提供支持。每次涉及文件系统的系统调用(如open、read、write等),都会通过路径查找来解析文件路径,以找到最终必要的dentry对象。
1. 路径查找的根本步骤

路径查找的过程是逐层解析路径名中的每个组件(用/分隔的子字符串),直到找到表示目的文件或目录的dentry为止,这个dentry称为最终dentry(final dentry)。路径查找包罗以下几个重要步骤:

  • 创建nameidata对象:每次路径查找都会创建一个nameidata对象,用于存储中央查找效果,包罗当前路径的dentry和状态信息。
  • 初始化出发点:查找路径的起始dentry取决于路径名的首字符。假如路径名以/开头,则查找从进程的根目录dentry开始;否则,从进程的当前工作目录dentry开始。
  • 逐层查找路径组件:内核依次查找路径名中的每个组件。在每级查找中,内核通过比较名称,将该组件与上一级dentry的子项名称进行匹配。
  • 缓存效果:每找到一个dentry,内核会将其保存在nameidata对象中,以加速后续查找。
  • 完成查找:路径查找完成后,调用complete_walk函数结束查找过程,返回查找状态。
2. 路径查找中的特别情况

在路径查找过程中,内核必要处理一些特别情况,例如符号链接(symlink)和挂载点(mount point):


  • 符号链接(Symlink):假如在路径查找中碰到一个符号链接,系统会调用trailing_symlink函数来解析符号链接,并将其指向的路径插入到当前路径查找中,继续解析。
  • 挂载点(Mount Point):假如dentry表示一个挂载点,查找过程会通过挂载树中的mount结构,切换到挂载文件系统的根目录dentry,并从该目录继续查找。
3. 路径查找的两大关键元素

路径查找过程的乐成与否重要取决于两个关键因素:起始点和挂载点。


  • 起始点:查找的起始点大概是根目录或当前工作目录,取决于路径名的首字符。对于通过chroot(改变根目录)系统调用更改过根目录的进程,路径查找的起始点也会随之改变,从而影响查找效果。
  • 挂载点和定名空间:挂载点大概因定名空间差别而表现差别。若进程所在的定名空间差别,则路径查找中的挂载点也会有所差别,导致类似路径在差别的定名空间中返回差别的查找效果。
4. 路径查找表示图

下面的表示图可以帮助明确路径查找过程如何解析路径组件,并逐步定位到最终dentry对象:
  1. 起点: [根目录dentry]    ----> /home/user/docs/file.txt
  2.                            |
  3.                            v
  4.                  [ / ] (根dentry)
  5.                            |
  6.                            |
  7.                  [ home ] (dentry)
  8.                            |
  9.                            |
  10.                 [ user ] (dentry)
  11.                            |
  12.                            |
  13.                 [ docs ] (dentry)
  14.                            |
  15.                            |
  16.                 [ file.txt ] (最终dentry)
复制代码
在该示例中:

  • 起始dentry是根目录dentry,因为路径以/开头。
  • 内核逐层解析路径的每个组件home -> user -> docs -> file.txt,在每级查找时比较当前目录中的文件名,找到匹配的dentry。
  • 每找到一个组件对应的dentry,就将其保存到nameidata对象中。
  • 最终找到目的dentry file.txt,即路径查找的终点。
5. 路径查找的优化

路径查找在VFS中的频率极高,Linux内核通过以下优化本领来加速路径查找:


  • Dentry缓存:系统会缓存最近访问的dentry对象,以淘汰重复查找的本钱。
  • 路径预解析:内核会预先解析已知路径,将其保存在高速缓存中,紧缩未来查找的时间。
总结

路径查找是Linux文件系统中一个频仍且重要的操作。通过路径查找,Linux内核能够高效地将用户提供的路径名转换为内核中的dentry结构。路径查找过程中的起始点和挂载点是影响查找效果的两个关键因素,内核通过符号链接和挂载树等机制处理路径中的特别情况,使得路径查找可以在复杂的文件系统环境中高效、正确地工作。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表