Linux内核学习(1) VFS学习

参考书籍:《深入理解Linux内核》

(一)VFS简介
VFS称为虚拟文件系统,linux设计上分为用户空间和内核空间,VFS的功能就是让用户空间的程序不用管文件系统的格式和类型从而进行统一的操作,所以这样说VFS就是文件操作的适配器。
下面是《深入理解Linux内核》中举的例子,当我们把一个文件系统(软盘)中的文件拷贝到另一个文件系统中去时,用户空间中只需要调用open,read,write,close等系统调用即可,VFS帮我们做了文件系统的差异系处理。
在这里插入图片描述

(二)通用文件模型
1.VFS通过通用文件模型来对文件系统进行描述,这个模型要求具有一般性,既能够反映大多数文件系统的存储结构。
2.通用文件模型由以下几项组成:
(1)超级块对象(supe_ block):此对象描述文件系统有关信息,例如文件系统类型,根目录,块大小等。
(2)索引节点对象(inode):此对象描述文件的具体信息,例如文件类型以及大小,存储位置等。
(3)目录项对象(dentry):组成用户可见的目录树的主要结构,保存了当前文件文件名,父目录项等,注意目录项不一定是目录,所有的文件都可以通过目录项对象来表示。
(4)文件对象(file):此对象对应于用户空间的File结构体,用于保存用户进行文件操作的相关参数,例如当前操作位置(偏移量),打开权限,文件所属用户ID等等。

(三)Linux VFS数据结构
1.上述对象里的成员(用OOP来描述容易理解)表明了对象的属性,而成员的方法表明了成员的能力。在OOP中可以用一种“继承统一的接口”实现简单的适配器模式,因此在C语言可以使用函数指针来表示接口,通过动态设置函数指针赋予各对象适配不同文件系统的能力。这里简要描述下各对象的成员对象和成员方法。
(1)

struct super_block{
.....
struct list_head s_list; //超级块链表
dev_t s_dev;//设备标识符
unsigned long s_blocksize;//以字节为单位的块大小
struct file_system_type *s_type;//文件系统类型
struct dentry * s_root;//文件系统根目录目录项
struct list_head s_inodes;//所有索引节点链表
struct list_head s_files;//文件对象链表。

struct super_operations *s_op;//超级块方法(成员方法)
}

(2)

struct inode{
.....
struct list_head i_list;//索引节点链表
struct super_block * i_sb;//此节点对应超级块
structlist_head i_dentry;//引用此索引节点的目录项链表
loff_t i_size;//文件字节数

struct inode_operations *i_op;//索引节点操作方法文件(成员方法)
}

(3)

struct dentry{
......
struct dentry * d_parent;//父目录的目录项
struct qstr d_name;//文件名
struct list_head d_subdirs;//目录项是目录时,子目录的目录项链表
struct super_block *d_sb;//文件的超级块对象
struct inode * d_inode;//该目录项对应的索引节点

struct dentry_operations * d_op;//目录项方法(成员方法)
}

(4)

struct file{
......
struct dentry *f_dentry;//文件的目录项对象
unsigned int f_flags;//打开文件指示的标志
unsigned int f_uid;//用户uid
loff_t f_pos;//当前文件位置位移量
struct vfsmount *f_vfsmnt;//改文件所处的文件系统

struct file_operations *f_op;//文件操作方法(成员方法)
}

2.从上面的结构体里面可以找到四个对象对应关系
(1)一个文件对象(file)对应一个目录项对象(dentry)
(2)一个目录项对应一个超级块(super_block),一个索引节点(inode)
(3)一个索引节点(inode)对应多个目录项(dentry),对应一个超级块(super_block)
(4)一个超级块对应多个文件对象(file),多个索引节点对象(inode)。
3.《深入理解Linux内核》通过下图来描述进程通过文件描述符找到文件在磁盘上存储路径的查找过程。
在这里插入图片描述

(四)VFS交互对象
1.只有VFS还不能提供操作文件方法,因为说到底VFS只是一层设计框架,具体的操作动作一般都通过其他对象读出来。VFS上层是用户层,下层是文件系统,再下层是硬件驱动,存储硬件。一般的Linux可以用下图表示VFS和块设备之间的层次结构。
在这里插入图片描述
而对于基于Flash设备嵌入式Linux则可以用下面的架构表示。
在这里插入图片描述

其中MTD全名Memory Technology Device,一般在基于Flash存储的Linux系统中需要用到,我们在/dev中可以看到Flash挂载后的设备名/dev/mtdblock,意思就是MTD块设备,之所以用到这个设备而不是直接用块设备是为了处理Flash的特性。Flash和传统的设备不同,在读和写操作外还有一个擦除(erase)操作,所以在文件读写时需要进行额外的操作,为了统一Flash操作就是呀MTD驱动专门操作Flash设备。
2.综合上述描述,可以看出Linux为了减少用户对不同硬件的疑虑做了两层操作:
(1)设计VFS消除不同文件系统的差异
(2)设计硬件驱动消除硬件间的差异

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值