acesyp

导航

学习成果:从dentry到inode的过程

首先对于昨天的内容进行一点补充。函数d_hash返回的结果是一个list_head也就是一个连接件。从dentry到list的过程很简单,但是如何从list返回到dentry?这个问题baggio已经提过了。大家可以看看情景分析第一章预备知识,有详细的讲解。这是LINUX内核的一个重要技巧,一定要看看。

今天在最核心的算法问题上产生了疑惑。同一目录下存在过多文件导致检索和存储效率的原因究竟是什么。原本认为是inode以树形结构连接,父节点下最多允许连接256个子节点,如果子节点数目大于256则要分成第二层甚至更多。事实上确实如此,只是没有最大256的连接限制。目录文件(暂时称之为文件夹吧,为了避免和dentry混淆)的数据区长度是不定的,其数据区存放的是指向其子目录和文件i_no的指针。因为不是定长,所以在查找的时候使用的是线性查找。一个文件夹下文件对象越多,检索效率越低。所以限制文件对象数目的方法是有效的。


有个设想中的改进算法。修改目录文件对应的inode结构,使其data区为定长,比如为256个数组。分配hash值最低的8位为生成文件ino值即inode的标识号,高24位为中间文件夹名。不过修改inode数据结构工程量浩大,留待以后改进时用


下面把path_walk()剩下的部分补全,也就是从上次讲的hash后在d_cache中查询开始直到找到目标节点的过程。


path_walk()>cached_up()>d_lookup()

在对路径名进行hash之后,由cached_lookup()进行dentry的查找。cached_lookup()只是一个“外包装”,之后在d_lookup()中由d_hash()对父节点地址和路径名hash值再进行一次散列运算,这就是昨天的blog所说的内容。得到的结果可以在全局范围唯一标识dentry。将这个hash值放到dentry_hashtable里面进行线性查找

path_walk()>cached_up()>d_lookup()>real_lookup()

如果在hashtable中得到需要的dentry结果就可以直接访问其inode结构。如果没有,则需要在磁盘上读入dentry。这个工作是由real_lookup()完成的。略去先前的准备工作,real_lookup()首先在内存中建立一个dentry结构,然后由当前所在目录(pwd)dentry->d_inode->i_op->lookup()在磁盘上查找所需的dentry结构。VFS中lookup()是个函数跳转指针,之后的工作由具体的fs函数完成


path_walk()>cached_up()>d_lookup()>real_lookup()>ext2_lookup()>ext2_find_entry()>iget()
以ext2为例,使用ext2_find_entry()在磁盘上查找。返回的结果是一个数据块,数据块上存放的是ext2_dir_entry_2结构(抽象到VFS对应一个dentry结构)。至于为什么一个数据块上一定会有一个dentry结构,这和ext2的工作方式有关,这里不展开。这里是ext2_dir_entry_2的定义:

struct ext2_dir_entry_2 {
 __u32 inode;   /* Inode number */
 __u16 rec_len;  /* Directory entry length */
 __u8 name_len;  /* Name length */
 __u8 file_type;
 char name[EXT2_NAME_LEN]; /* File name */
};

inode即为ino。将这个参数和superblock信息交给iget()就可以查到磁盘上的inode位置。(之间也要经历一个散列表和缓冲区,过程和dentry几乎一致。不是重点就不说了。同样不是重点的是判断这个inode是不是一个链接,也略过不提)。将这个inode在内存中建立,与dentry挂钩,将dentry链入hash表。到这里一个查找过程就结束了。


注意:上面这些只是基于《情景分析》一书的理论分析。并不能用于实际操作。因为对于我们的文件系统,inode->i_op跳转到fist生成的文件系统而非挂载点所在设备的文件系统。实现时的改动是今天的功课。函数跳转表在具体的文件系统实现时,一般写在inode.c,file.c等文件的末尾的一个struct inode_operation内


另外,一个忠告。读内核的时候千万不能根据函数字面意义想当然。而且函数辗转调用的关系表一定要清晰。不然的话……

感觉我这几天除了对情景分析进行节选之外别的都没做什么事。


大家对这些东西有疑问的话直接点击右下角的评论好了。多讨论多总结总是没错的


为什么我写完东西总是习惯性地按Ctrl + W ?

posted on 2005-04-25 15:06  AceSYP  阅读(5158)  评论(2编辑  收藏  举报