再读《Linux内核设计与实现》之VFS

最近细读tcp/ip协议栈实现,遇到了文件系统的一些障碍。比如需要声明socket文件系统,以及对文件的读写最后怎么转化为socket的处理。于是再读一下VFS原理,发现,有些东西确实不用就忘了,这里在记录一下吧。

VFS的作用
对上层应用程序,屏蔽底层设备的不同,抽象出一个统一的操作接口。像write(fd,&buf,len)此类操作,应用层不需要关心文件实际的存储方式,存储位置。最后数据可以被存储在硬盘中,软盘中,甚至远端的主机。
VFS实现
VFS采用面向对象的操作方式(这种方式我提到过了),主要分为四种对象类型。
超级块对象:它代表了一个已安装的文件系统。文件系统必需,文件系统信息。其中s_op指向操作对象。
索引节点(inode)对象,代表一个文件。包含了内核操作文件所需的全部信息。i_op指向操作对象
目录项对象,它代表一个目录项,是路径的一个组成部分。该部分的引入是为了查找的方便。每个dentry代表路径中的一个特定部分。在路径中每一个部分都是目录项对象,包括最后的普通文件。目录项有三种有效状态,被使用,未被使用和负状态。
文件对象,它代表由进程打开的文件(这个是用户最关心的)。该对象不对应于物理文件,而是由open打开,close销毁。不是唯一的,同一个文件可以对应多个文件对象。
对应的,有四个操作对象
super_operation对象,对该特定文件系统的调用方法
i node_operation对象,特定文件的方法。其中的方法由具体的文件系统提供,这里就实现了对多个文件系统的支持。
dentry_operation对象,特定目录的操作方法。
file_operation 对象,包括进程针对已经打开的文件的操作方法。具体的文件系统需要实现其中的方法。

附加数据结构:
file_system_type 用来描述指定特定的文件系统。在sock_init里面见到过,那里注册了sock文件系统。
vfsmount,用来描述一个安装文件系统的实例。
三个和进程相关的数据结构
file_struct ,由进程描述符中的file指过来。包含了所有与进程相关的信息。
fs_struct,由进程描述符中的fs指过来,包含了文件系统和进程相关的信息。用于定义根目录等
namespace,由进程描述符中的namespace指过来,2.4内核以后,单进程命名空间被加入到内核中,它使得每一个进程在系统中都看到唯一的安装文件系统,不仅是唯一的根目录,而且是唯一的文件系统层次结构。默认情况下,所有的进程共享同样的命名空间。只有在进行clone操作时使用CLONE_NEWNS标志,才会给进程一个另外的命名空间结构体的拷贝。大多数进程不提供这个标志,所有进程都继续其父进程的名字空间。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值