- 1
- 0
- 约4.19千字
- 约 6页
- 2019-11-30 发布于湖北
- 举报
文件名到索引节点的查找
一,总体过程:
__user_walk()首先调用path_init()查找文件绝对路径名或相对路
径名的搜索起点的根目录或当前目录,接着调用path_walk()在目
录项内得到对应的索引节点。
二,代码分析,详细原理:
/*参数: name: 指向在用户空间中的路径名
flags: 用来指示怎样寻找目标的标志位
nd: nameidata结构用于在路径查找过程中记录中间信息和查找结果
struct nameidata{
struct dentry *dentry;
struct vfsmount *mnt;
struct qstr last;
unsigned int flags;
int last_type;
};
*/
int __user_walk(const char *name, unsigned flags, struct nameidata *nd)
{
char *tmp;
int err;
tmp = getname(name);/* 通过getname()在系统空间中分配一个页面,
从用户空间把文件名name复制到这个页面中,
并把分配的页面的路径名赋给tmp */
err = PTR_ERR(tmp); /* 强制转换tmp为long,用来判断函数的返回值
是否是一个有效的指针,指针有三种情况,一种是有
效指针,一种是NULL,空指针,一种是错误指针,或
者说无效指针,就是指其已经到达了最后一个page.
内核空间最高地址0xffffffff,那么最后一个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))/* 若返回1,则完成对路径的搜索工作,
即对nameidata结构的初始化完成,此时
nameidata结构中的指针dentry指向路径
搜索的起点 */
err = path_walk(tmp, nd); /* 通过path_walk()顺着路径名的指引进
行搜索,找到索引节点*/
putname(tmp); /* 通过putname()释放之前动态分配的空间 */
}
return err;
}
int path_init(const char *name, unsigned int flags, struct nameidata *nd)
{
nd-last_type = LAST_ROOT; /* 将nameeidata结构中的last_type字段
设置成LAST_ROOT,在搜索的过程中,
这个字段的值会随着路径名的当前搜索结
果而变。例如当成功地找到目标文件,
会变成LAST_NORM;当最后停留在一个“.”
上,则变成LAS
您可能关注的文档
最近下载
- 《变幻的空间》 课件 2026浙美版美术八年级下册.ppt
- 2026年中国豆制品市场深度分析与发展动向研究报告.docx
- 学位论文___土木工程(结构工程)中学学生宿舍楼.doc VIP
- 初中生数学学习困难学生的心理辅导与教育干预策略教学研究课题报告.docx
- 2026浙美版美术八年级下册第二单元第4课《黑白的魅力》课件.pptx
- 职业病诊断医师考试题库及答案.docx VIP
- 火力发电厂典型事故案例汇编.pdf VIP
- 语文学习困难学生帮扶方案.docx VIP
- 2025年四川省广安市高考物理二诊试卷(含详细答案解析).docx VIP
- 全国大学生数学建模竞赛b题全国优秀论文.docx VIP
原创力文档

文档评论(0)