Chinaunix首页 | 论坛 | 博客
  • 博客访问: 123587
  • 博文数量: 50
  • 博客积分: 125
  • 博客等级: 入伍新兵
  • 技术积分: 255
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-20 12:01
文章分类

全部博文(50)

文章存档

2013年(7)

2012年(43)

我的朋友

分类:

2012-11-08 09:47:50

原文地址:linux kernel 文件系统5 作者:BENNYSNAKE

8.   进程与文件系统的关联

8.1.              “打开文件”表和 files_struct结构

一个进程可以打开多个文件,每打开一个文件,创建一个 file 结构。所有的 file 结构的指针保存在一个数组中。而文件描述符正是这个数组的下标。

我记得以前刚开始学习编程的时候,怎么都无法理解这个“文件描述符”的概念。现在从内核的角度去看,就很容易明白“文件描述符”是怎么回事了。用户仅仅看到一个“整数”,实际底层对应着的是 file, dentry, inode 等复杂的数据结构。

files_struct 用于管理这个“打开文件”表。

struct files_struct {
     atomic_t count;
     rwlock_t file_lock;    
/* Protects all the below members.   Nests inside tsk->alloc_lock */
    
int max_fds;
    
int max_fdset;
    
int next_fd;
    
struct file ** fd;    /* current fd array */
     fd_set 
*close_on_exec;
     fd_set 
*open_fds;
     fd_set close_on_exec_init;
     fd_set open_fds_init;
    
struct file * fd_array[NR_OPEN_DEFAULT];
};

其中的 fd_arrar[] 就是“打开文件”表。

task_struct 中通过成员 files 与 files_struct 关联起来。

8.2.              struct fs_struct

task_struct 中与文件系统相关的还有另外一个成员 fs,它指向一个 fs_struct 。

struct fs_struct {

        atomic_t count;
        rwlock_t 
lock;
       
int umask;
       
struct dentry * root, * pwd, * altroot;
       
struct vfsmount * rootmnt, * pwdmnt, * altrootmnt;
};


其中:

root 指向此进程的“根目录”,通常就是“根文件系统”的根目录 dentry

pwd 指向此进程当前所在目录的 dentry

因此,通过 task_struct->fs->root,就可以找到“根文件系统”的根目录 dentry,这就回答了 5.1 小节的第一个问题。

rootmnt :指向“安装”根文件系统时创建的那个 vfsmount 

pwdmnt:指向“安装”当前工作目录所在文件系统时创建的那个 vfsmount

这两个域用于初始化 nameidata 结构。


8.3.              进程与文件系统的结构关系图

下图描述了进程与文件系统之间的结构关系图:

阅读(544) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~