不同的文件系统有不同的实现,但和VFS的接口都是通过一个file_operation数据结构
(include/linux/fs.h),作为函数跳转表。
struct file_operation{
struct module *owner;
.. llseek()
.. read()
.. write()
.. readdir()
.. ioctl()
.. mmap()
.. open()
.. flush()
.. fsync()
.. lock()
}
用户进程只和VFS交互。
-----------------------------------------
task_struct中的两个相关结构体
struct task_struct {
/*
struct fs_struct{
atomic_t count;
rwlock_t lock;
int umask;
/*
文件的属性,如文件名、访问权限
root 本进程的根目录,即用户登录时看到的根目录
pwd 进程当前所在目录
altroot 用户设置的“替换根目录” -- 再议
dentry结构中有一个d_inode(struct inode)指针,指向记录着文件在
存储介质上的位置和分布信息的inode结构体
dentry 是逻辑文件
inode 是物理文件 所以多个dentry指向一个inode
*/
struct dentry *root, *pwd, *altroot;
/*
对应着上三个结构
*/
struct vfsmount *rootmnt, *pwdmnt, *altrootmnt;
}
*/
struct fs_struct *fs;//文件系统信息,全局的,与具体文件无关
/*
files_struct 主体是一个file结构数组
每打开一个文件,进程就通过一个fid访问,fid实际是相应file 结构在数组中的下标
每个file结构中
f_op 指向该文件所属文件系统的file_operation
f_dentry 指向该文件的dentry
*/
struct files_struct *files;//已打开的文件的信息
}
---------------------
inode结构体
每个inode都有
一个“i节点号”i_ino,同一文件系统中唯一
一个“文件主”,为创建文件的用户,可改变 -- 系统每个用户都有一个uid标识,都属于一个组gid,所以inode也有两个对应i_uid、i_gid字段
两个设备号 i_dev 除特殊文件外,一个索引节点总需存在在某个设备上,即i_dev
i_rdev 若索引节点达标的是某个设备(即不是常规文件),则需另一个设备号i_rdev
(主设备号、次设备号)
i_link 文件链接数,即文件别名数
i_count [动态]文件共享计数
阅读(1028) | 评论(0) | 转发(0) |