1. 前言
前面说到通过调用函数path_openat以解析文件路径,path_openat中包装了两个重要的函数path_init和link_path_walk,本文就从这两个函数开始,继续打开文件的旅程。
2. path_opennat
再次看一下path_opennat函数,其中的path_init和link_path_walk通常连在一起调用,二者合在一起就可以根据给定的文件路径名称在内存中找到或者建立代表着目标文件或者目录的dentry结构和inode结构。
1 |
|
3.path_lookup
在内核版本2.6,已经使用path_lookup函数代替了path_init函数,实现的功能都是一样的,做查找前的准备工作,初始化nd,nd存储的是查找结果,nd就是nameidata结构体。具体实现如下:
1 |
|
函数最后调用link_path_walk进行实际的搜索工作。
4.link_path_walk
path_lookup函数执行成功后,就会在nameidata结构体的成员dentry中指向搜索路径的起点,接下来就是link_path_walk函数顺着路径进行搜索了。
1 | int link_path_walk(const char * name, struct nameidata *nd) |
该函数比较长,其中调用了几个重要的函数需要逐一进行介绍。
follow_dotdot的作用是查找当前节点的父目录。
1 |
|
do_lookup函数找到或者建立的所需的dentry结构
1 |
|
该函数主要是从内存中查找inode或者从磁盘查找,从内存中的哈希表中查找使用函数__d_lookup,从磁盘中查找又会调用real_lookup。
1 |
|
1 |
|
从磁盘中寻找当前节点目录项,该函数因文件系统而异,inode节点中的i_op定义。ext2是ext2_dir_inode_operations。
继续来看ext2_lookup。
1 |
|