目录实现分析
1. Xv6目录简介
在xv6中目录的也是用inode来表示的,只是inode中的type字段为T_DIR。普通文件的数据块中保存的是文件的内容,但是目录inode的数据块中保存的是一系列的struct dirent数据结构。一个struct dirent用来表示一个文件,其内容如下:
inum表示文件的inode编号,name表示文件的名字。struct dirent可以理解为一个目录条目。
2. namecmp函数
这个接口很简单,就是比较两个字符串是否是一致的。
3. dirlookup函数
dirlookup根据指定的文件名在目录内容中寻找同名的文件条目,并返回此条目的Inode。
- 通过一个循环来循环读取Inode中的内容,每次读取的大小都是struct dirent这么大。
- 通过readi来读取一个目录条目到struct dirent变量中,如果条目中的inum为0则继续读取下一个条目。
- 接着比较给定的名字是否和条目中的名字相同,如果相同表示找到符合条件的目录条目,然后根据条目中记录的inode编号获取此Inode(通过调用iget实现)。
4. dirlink
将一个新的目录条目写到目录inode中。
- 首先检查目录中是否已经有此条目,如果有的话,则调用iput检查inode的引用计数(???)。
- 然后在目录中寻找一个空闲的目录条目。
- 如果找到则将指定的名字和Inode编号写到条目中(通过writei接口)。
评论