📄 vfs
字号:
any problems, send mails to lysindybear@sina.com.cn
相关文件
/include/linux/dcache.h
/include/linux/fs.h
linux的vfs系统比较复杂,但是同样也为我们制作一个新的文件系统提供了很大的方便。
对于每一个进程task,它的结构中一共有两个成员变量和文件系统有关,
struct fs_struct *fs;
struct files_struct *files;
他们分别用来描述文件系统的特性(fs),和这个进程所使用的文件的性质(files),
我们可以使用下面的图来表示各种结构之间的关系
[struct files_struct]
(file*) [fd_array0]----------------->[struct dentry]
[fd_array1] |---> [d_inode]----------->[struct inode]
[fd_array2] | |--->
[………… ] | |
[fd_arrayN]-------------| |
[………… ] |
[fd_arrayM]----------------->[struct dentry] |
[d_inode]--------
从上面的示意图可以看出来,在磁盘上的物理的文件使用唯一的一个inode结构来表示,一个逻辑上的文件
使用唯一的一个dentry结构来表示,也就是说比如一个文件还有一个符号连接文件,那么这个符号连接文件
也有一个dentry结构,但是他也指向那个物理文件的inode结构。
但是对于进程的files成员来说,他的每一个成员仅仅表示对文件的一次打开过程,也就是说,没打开一次文件,
无论什么文件,他都要在这个结构数组中申请一个files结构,即使对同样的一个文件,如果打开多次,那么
也会有不同的files结构来对应,因为他们的访问位置,权限等都可能不同。
另外,这些结构都有自己相应的函数操作集,
(1)struct file结构有一个file_operations * f_op属性。
(2)dentry结构有一个dentry_operations * d_op属性
(3)inode结构有一个inode_operations * i_op属性,还有一个file_operation * i_fop
(4)super_block结构有一个super_operations * s_op属性,
其中最为关键的就是inode结构中的i_op和i_fop属性,对于i_op,其中的主要的操作就是读写inode节点,
因为一个inode节点就是一个文件或者目录,所以读写这个结构,就相当于读一个文件进入内存或者写出
一个文件到外存。而i_fop则是对这个具体的文件进行读写,定位等操作的具体的实现。
对于file结构中的f_ops,完全是复制inode机构中的i_fop的,也就是说这个属性是系统自动复制的。
由此可以看出,如果开发一个文件系统的话,最为关键的就是为inode这两个结构进行赋值。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -