搜索
查看: 1345|: 0

Linux-2.6open()打开文件涉及的内核处理和数据结构分析

[复制链接]

128

主题

5

回帖

433

积分

中级会员

积分
433
发表于 2014-8-18 16:58:08 | 显示全部楼层 |阅读模式

Linux-2.6 文件打开过程涉及数据结构分析:

用户层面

文件打开的结构为:

fd = open(path,flag,mode)

内核层面

open函数内陷到内核空间后,做了以下操作:

系统根据path,遍历路径。linux中一切皆文件,包括目录同样被视为文件。每个文件都有一个入口结构来标示dentry{},如果dentry记录的为目录文件,那么dentry->d_inode描述的是当前目录下的子目录的存储信息,反之,如果dentry记录的为文件,那么dentry->d_inode记录了文件相关的存储信息。linux中有个path_walk,会根据参数path中的字段和dentry->d_name进行目录的查找和遍历,path->dentry->d_inode找子目录信息,循环遍历,直到找到目标文件的dentry。目标文件的inode即为dentry->d_inode所指向的节点。

3. 构建打开文件的描述结构 file{}当找到目标文件的i节点后,对新建的file结构进行初始化,如图蓝色箭头所示,
file->f_path = *path;
file->f_inode = path->dentry->d_inode;
file->f_mapping = path->dentry->d_inode->i_mapping;
file->f_mode = mode;
file->f_op = fop;
...

4. 构建fd和file的关系将file地址记录于task_struct->files->fd_array[fd] = &file

总结进程打开一个文件后,内核为其构建了file{}结构,用于描述文件的读写mode、flag、当前读写位置f_pos以及文件操作的接口f_op等。而进程是通过task_struct->files->fd_array[]纪录所有打开的文件,每个打开的文件通过数组的下标进行唯一标示,这个下标即为我们open函数的返回值fd(int类型)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

大数据中国微信

QQ   

版权所有: Discuz! © 2001-2013 大数据.

GMT+8, 2024-12-24 02:39 , Processed in 0.058946 second(s), 25 queries .

快速回复 返回顶部 返回列表