linux文件名到索引节点的查找案例分析

linux文件名到索引节点的查找案例分析

ID:14499456

大小:135.45 KB

页数:5页

时间:2018-07-29

linux文件名到索引节点的查找案例分析_第1页
linux文件名到索引节点的查找案例分析_第2页
linux文件名到索引节点的查找案例分析_第3页
linux文件名到索引节点的查找案例分析_第4页
linux文件名到索引节点的查找案例分析_第5页
资源描述:

《linux文件名到索引节点的查找案例分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、文件名到索引节点的查找一,总体过程:__user_walk()首先调用path_init()查找文件绝对路径名或相对路径名的搜索起点的根目录或当前目录,接着调用path_walk()在目录项内得到对应的索引节点。二,代码分析,详细原理:/*参数:name:指向在用户空间中的路径名flags:用来指示怎样寻找目标的标志位nd:nameidata结构用于在路径查找过程中记录中间信息和查找结果structnameidata{structdentry*dentry;structvfsmount*mnt;structqstrlast;unsignedintflags;intlast_type;};*

2、/int__user_walk(constchar*name,unsignedflags,structnameidata*nd){char*tmp;interr;tmp=getname(name);/*通过getname()在系统空间中分配一个页面,从用户空间把文件名name复制到这个页面中,并把分配的页面的路径名赋给tmp*/err=PTR_ERR(tmp);/*强制转换tmp为long,用来判断函数的返回值是否是一个有效的指针,指针有三种情况,一种是有效指针,一种是NULL,空指针,一种是错误指针,或者说无效指针,就是指其已经到达了最后一个page.内核空间最高地址0xffffffff

3、,那么最后一个page就是指的0xfffff000~0xffffffff(4k一个page)*/if(!IS_ERR(tmp)){/*getname()返回有可能是一个分配的页面的首地址:通过PTR_ERR()将这个指针类型的地址转化为一个整型,再通过IS_ERR()判断是否是一个有效的页面首地址;若getname()返回时错误码情况,ENOMEM定义值是12,经过ERR_PTR(-ENOMEM)返回成了指针类型,指向0xFFFFFFF4,指向虚拟内核空间的top4KB空间,通过IS_ERR()判断返回的是false*/err=0;if(path_init(tmp,flags,nd))/*

4、若返回1,则完成对路径的搜索工作,即对nameidata结构的初始化完成,此时nameidata结构中的指针dentry指向路径搜索的起点*/err=path_walk(tmp,nd);/*通过path_walk()顺着路径名的指引进行搜索,找到索引节点*/putname(tmp);/*通过putname()释放之前动态分配的空间*/}returnerr;}intpath_init(constchar*name,unsignedintflags,structnameidata*nd){nd->last_type=LAST_ROOT;/*将nameeidata结构中的last_type字段设

5、置成LAST_ROOT,在搜索的过程中,这个字段的值会随着路径名的当前搜索结果而变。例如当成功地找到目标文件,会变成LAST_NORM;当最后停留在一个“.”上,则变成LAST_DOT*/nd->flags=flags;/*标志位*/if(*name=='/')/*路径名若是以“/”开头,则说明给出的是绝对路径,需要通过walk_init_root()从根节点开始查找*/returnwalk_init_root(name,nd);/*“替换”根目录,完成工作:当前进程的进程控制块中有个指针fs指向一个fs_struct结构,其中有个指针pwd(即current->fs->pwd指向“当前工

6、作目录”的dentry,将nameidata中的指针dentry指向这个dentry,同理nameidata中的指针mnt指向这个vfsmount*//*此时已经是(或转换成)相对路径,要从当前进程环境中取出当前目录的dentry,及mnt*/read_lock(¤t->fs->lock);/*上锁状态*/nd->mnt=mntget(current->fs->pwdmnt);/*与下面的dentry操作类似*/nd->dentry=dget(current->fs->pwd);/*调用dget()增添共享计数(因为dentry多了一个“用户”)*/read_unlock(&c

7、urrent->fs->lock);/*解锁状态*/return1;}三,流程图:getname()返回值是否有效强制转换getname()返回值调用getname()分配页面否是调用path_init()搜索根目录成功?否调用path_walk()查找索引节点是__user_walk流程图路径名是否以“/”开头否是read_lock()read_lock()调用mntget(),dget()增加共享计数调用walk_i

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。