Xv6内核分析(十九)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2020年12月20日18:59:01 评论 597

路径名解析功能分析

路径名解析就是依次寻找目录中的元素,直到找到匹配的文件。比如要想寻找/a/b.txt文件,则解析顺序如下:

  • 在根目录’/‘inode中寻找名为a的条目。
  • 由于a也是一个目录,则继续在a的inode中寻找名为b.txt的条目。
  • 如果找到则返回b.txt的inode。

1. skipelem函数

path表示文件的路径名,类似于"/a/b.txt"这样的,name用于保存解析出的第一个元素的名字,对于"/a/b.txt"而言,解析出的第一个元素就是a。skipelem返回的是除去第一个元素后的路径名。

Xv6内核分析(十九)

  • 首先跳过所有的'/'字符。
  • s表示第一个既不是'/'也不是'\0'的字符的位置。
  • 接着寻找下一个为'/'或者'\0'的字符的位置,用path表示。
  • 然后将s代表的字符复制到name中,表示解析出的第一个元素。
  • 接着跳过path中的所有'/'字符,之后path就表示除去第一个元素后的路径名。

2. namex函数

namex就是解析路径名的核心函数,此函数会被namei和nameiparent调用。nameiparent参数用于标明最后返回的是路径名的inode还是路径名上一层元素的Inode。

Xv6内核分析(十九)

  • 首先检查路径名是全路径名还是相对路径名,如果是全路径名则调用iget获取根目录的inode,如果是相对路径则通过调用idup获取当前工作目录的inode。
  • 接着通过while循环调用skipelem循环解析路径名。
  • 在while循环的开始首先调用ilock锁住Inode,接着检查inode的类型,如果不是目录类型直接返回。然后检查调用者是否想返回的是路径名上一层的inode,判断条件是nameiparent为1并且path地址中的值为0。
  • 然后根据解析的名字调用dirlookup来在目录中寻找其对应条目并返回inode,由此可以看出,ip表示的是上一层目录的inode,而next表示的是当前name对应的Inode。
  • 如果找到则返回,如果没有则继续下一轮解析查找。
  • 如果while循环结束且nameiparent为1,则表示返回上一级目录失败,因为如果上一级目录存在,在while循环中就会返回。
  • 最后返回路径名对应的Inode。

3. namei和nameiparent

这两个函数分别用于根据路径名返回对应的inode和上一级inode,函数很简单,就是对namex做了一层封装。

Xv6内核分析(十九)

gewenbin
  • 本文由 发表于 2020年12月20日18:59:01
  • 转载请务必保留本文链接:http://www.databusworld.cn/9553.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: