77范文网 - 专业文章范例文档资料分享平台

虚拟文件系统(2)

来源:网络收集 时间:2018-11-27 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

像;而inode结构代表物理意义上的文件,记录文件的物理属性,它在磁盘上有对应的映像。dentry数据结构的主要域定义如下:

Struct dentry {

Atomic_t d_count; //目录项dentry引用计数 unsigned int d_flags; //dentry状态标志 struct inode * d_inode; //与文件关联的索引节点 struct dentry * d_parent; //父目录的dentry结构 struct list_head d_hash; //dentry形成的哈希表 struct list_head d_lru; //未用的LRU双向链表

struct list_head d_child; //父目录的子目录项dentry形成双向链表 struct list_head d_subdirs; //该目录项的子目录形成的双向链表 struct list_head d_alias; //索引节点别名的链表 int d_mounted; //目录项的安装点

struct qstr d_name; //目录项名,用于快速查找 unsigned long d_time; //重新生效时间

struct dentry_operations *d_op; //操作目录项的函数

struct super_block *d_sb; //目录项树的根

void *d_fsdata; //文件系统特殊数据

unsigned char d_iname[DNAME_INLINE_LEN];//文件名前16个字符 ? };

一个有效的dentry结构必定对应一个inode结构,这是因为目录项要么代表一个目录,要么代表一个文件,目录实际上也是文件。所以,只要dentry结构有效,则其指针d_inode必定指向一个inode结构。反之不然,一个inode可能对应多个dentry结构,也就是说,一个文件可以有多个文件名或路径名,这是因为一个已经建立的文件可以被链接(link)到其他文件名。所以在inode结构中有一个队列i_dentry,凡代表同一个文件的所有目录项都通过其dentry结构中的d_alias域拉构体入相应inode结构中的i_dentry队列。

在内核中有一个散列表dentry_hashtable,是一个list_head的指针数组,一旦在内存中建立一个目录节点的dentry结构,就通过它的d_hash域链入散列表中的某个队列中。内核中还有一个队列dentry_unused,凡是已经没有用户使用的dentry结构就通过其d_lru域挂入空闲队列。Dentry结构中除资d_alias、d_hash和d_lru三个队列外,还有d_vfsmntd_child及d_subdirs队列,第一个仅在dentry为安装点时使用;当该目录节点有父目录时,则其dentry结构就通过d_child挂入其父节点的d_subdires队列中,同时,又过d_parent指向其父目录的dentry结构,而它自己各个子目录的dentry结构则挂在其d_subdirs域指向的队列中。

可见一个文件系统中所有目录项结构,或组织成一个散列表,或组织成一颗树,或组织成一个链表,这将为文件访问和文件路径搜索奠定良好基础。与目

录项关联的方法就是目录项操作对象,这些操作由dentry_operation结构来描述:

struct dentry_operation {

int (*d_revalidate)(struct dentry *,int);

int (*d_hash)(struct dentry *,struct qstr *);

int (*d_compare)(struct dentry *,struct qstr *,struct qstr *); int (*d_delete)(struct dentry *);

int (*d_release)(struct dentry *);

int (*d_iput)(struct dentry * , struct inode *); ? };

其中,主要函数功能如下:d_revalidate ( )判定目录项是否有效,d_hash( )生成一个散列值,d_compare( )比较两个文件名,d_delete( )删除d_count为0的目录项对象,d_release( )释放一个目录项对象,d_iput( )丢弃目录项对应的索引节点。

4与进程相关的文件结构 (1) 文件对象

每个文件都用一个32位数字来表示下一个读写的字节位置,通常称它为文件位置或偏移量(offset),每当打开一个文件时,偏移量被置0,读写操作便从这里开始,允许通过系统调用lseek对文件位置作随机定位。Linux建立了文件对象(file)来保存打开文件的文件位置,这个对象称为打开的文件描述符(open file description)。File结构除保存文件位置外,还把指向该文件索引节点的指针也放在其中,file结构形成一个双向链表,称系统打开文件表其结构的主要域定义如下:

struct file{

struct list_head f_list; //所有打开文件形成的链 struct dentry *f_dentry; //指向相关目录项的指针 struct vfsmount *f_vfsmnt; //指向VFS安装点的指针 struct file_operation *f_op; //指向文件操作表的指针 mode_t f_mode; //文件打开模式 loff_t f_pos; //文件当前位置

unsigned short f_flags; //打开文件时指定的标志 unsigned short f_count; //使用此结构的进程数 ? };

每个文件对象总是包含在下列中的一个双向环形链表中: ·“未使用”文件对象链表 该链表可以用做文件对象的内存缓冲区,通常设置为可放10个对象,且其中必须包含NR_RESERVED_FILES对象。

·“正在使用”文件对象链表 该链表中的每个元素至少由一个进程在使用,故各个元素的f_count域必定非空。如果VFS需要分配一个新的文件对象,就调用函数get_empty_file( ),它检测“未使用”文件对象链表的元素是否多于NR_RESERVED_FILES,如果是,则选一个元素使用,否则退回到正常的内存分配。

与文件关联的方法就是文件操作对象,这些操作由file_operation结构来描述: struct file_operation {

loff_t(*llseek)(struct file *,loff_t,int);

ssize_t(*read)(struct file *, char * ,size_t,loff_t *);

ssize_t(*write)(struct file *, const char * ,size_t,loff_t *); int (*mmap)(struct file *,struct vm_area_struct *); int (*open)(struct inode *,struct file *); int (*fiush)(struct file *);

int (*release)(struct dentry *);

int (*fsync)(struct file * , struct dentry * , int datasync); ? }; 其中,主要函数功能如下:llseek( )修改文件指针,read( )从文件中读出若干字节,write( )向文件中写入若干字节,mmap( )文件到内存的映射,open( )打开一个文件,flush( )关闭文件时减少f_count计数,release( )释放文件对象,fsync( )将文件在缓冲的数据写回磁盘。

(2) 用户打开文件表

文件描述符用来描述打开的文件,每个进程用一个files_struct结构来记录文件描述符的使用情况,这个结构称为用户打开文件表,它是进程的私有数据,其定义如下: struct files_struct{

atomic_t count; //共享该表的进程数 rwlock_t file_lock; //保护以下所有域

int max_fds; //当前文件对象的最大数 int max_fdset; //当前文件描述符的最大数

int next_fd; //已分配的文件描述符加1的值 struct file* *fd; //指向文件对象指针数组的指针

fd_set *close_on_exec; //指向执行exec( )时需关闭的文件描述符 fd_set *open_fds; //指向打开文件描述符的指针

fd_set close_on_exec_init; //执行exec( )时需关闭的文件描述符初值集

fd_set open_fds_init; //文件描述符初值集

struct file* fd_array[32]; //文件对象指针的初始化数组 };

fd域指向文件对象的指针数组,数组的长度存放在max_fds域中,通常,fd域指向files_struct结构的fd_array域,该或包含32个文件对象指针。如果进程打开的文件数目大于32,内核分配一个新的文件指针数组,并将其地址存放在fd域中,同时更新max_fds域的值。

对于在fd数组中有入口地址的每个文件来说,数组的索引就是文件描述符。通常,数组的第一个元素(索引为0)、第二个元素(索引为1)和第三个元素(索引为2)分别表示标准输入文件、标准输出文件和标准错误文件。通过适当的系统调用,两个文件描述符可以指向同一个打开的文件,亦即数组的两个元素可以指向同一个文件对象。 (3) fs_struct结构

fs_struct结构描述进程与文件系统的关系,其定义为:

struct fs_struct {

atomic_t count; //共享同一个fs_struct表的进程数 rwlock_t lock; //保护此结构体的锁 int umask; //默认的文件访问权限 struct dentry *root; //根目录的目录项对象

struct dentry *pwd,; //当前工作目录的目录项对象 struct dentry *altroot; //可替换的根目录的目录项对象 struct vfsmount *rootmnt; //根目录的安装点对象

struct vfsmount *pwdmnt; //当前工作目录的安装点对象 struct vfsmount *altrootmnt; //可替换的根目录的安装点对象

};

fs_struct中的dentry结构是对一个目录项的描述,root、psw和altroot三个指针都指向这个结构,在程序实际运行时,这三个目录不一定都在同一个文件系统中,例如,进程的根目录通常安装于“/”节点上的Ext2文件系统,而当前工作目录可能是安装于/msdos目录下的DOS文件系统。因而,fs_struct结构中的rootmnt、pswmnt及altroot就是对上述三个目录的安装点的描述,安装点的数据结构类型为vfsmount。

5 主要数据结构之间的关系

超级块是对一个文件系统的描述,索引节点是对一个文件物理属性的描述,而目录项是对一个文件逻辑属性的描述。此外,文件与进程之间的关系是由另外的数据结构来描述的,一个进程所处的位置是由fs_struct结构来描述,而进程打开的文件是由files_struct来描述,整个系统打开的文件由file结构来描述。图7- 给出了这些数据结构之间的关系。 fs_struct task_struct ? fs ? files files_struct count Close_on_exec count umask dentry d_inode dentry *root *pwd *altroot d_inode file f_mode inode dentry union i_op fd[0] fd[1] ? fd[255] f_pos f_flages f_count f_owner f_dentry f_op d_inode d_op file_operation d_inode 图7- 与进程相关的主要数据结构问的关系

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库虚拟文件系统(2)在线全文阅读。

虚拟文件系统(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/315866.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: