漫谈操作系统7 -- 一切皆为文件

熟悉Linux或者其他类Unix操作系统应用程序写法的程序员会清楚,对于操作系统来说对外提供的对操作系统内核态各种资源的访问大多是通过文件描述符来达成的(socket也是一种文件描述符)。 所以在一定程度上我们可以认为操作系统内部的一切资源都可以抽象为文件,那操作系统是如何得知这些不同的资源应该使用什么代码来进行操作和访问的呢,这就要通过VFS(虚拟文件系统)来进行解释了。


首先我们可以知道在Linux/FreeBSD这些操作系统之上,都可以使用mount将不同类型的文件系统挂载到系统的目录树结构之上,而对于不同的文件系统来说其内部的格式和数据结构定义,磁盘上文件的组织形式都是不一样的,相应的不同的文件系统有不同的代码,那么就需要操作系统内部能够根据访问的路径关联正确的文件系统操作方法并由正确的文件系统代码对其进行访问,否则就会造成文件系统的损坏。而操作系统中负责根据磁盘上的路径关联正确的文件系统访问代码进行操作的部分就是 VFS 虚拟文件系统。


我们可以简单的把 VFS 理解为一个各种兼容访问函数钩子的分发系统,它根据所访问节点的路径,选择正确的访问方法,并调用,从而将所有的对磁盘路径上节点的操作都抽象为一组 open/read/write/close/ioctl/....的调用,从而能够对用户态提供统一的系统调用接口,而避免对操作系统内核的访问接口随着系统内部功能的增加而无限制的膨胀,试想如果没有VFS,我们每添加一种新的文件系统就会增加诸如  ntfs_open/ntfs_read/....等的函数,并且无法根据文件系统路径进行统一的抽象和挂载,这无疑会影响系统的扩展性和兼容性,所以对于操作系统领域来说VFS是一个伟大的创造性发明。


VFS我们可以简单的理解为下图

漫谈操作系统7 -- 一切皆为文件_第1张图片

对于内核态来说VFS的核心是一个函数 namei 感兴趣的可以查看Linux/FreeBSD系统的代码,其核心内容是一个遍历文件系统路径根据其目录树上的挂载信息匹配合适的文件系统访问方法的函数。


1.  宏内核的VFS实现

宏内核的操作系统中VFS的实现是通过函数的同步调用来实现的,其并没有什么特殊之处,而对于Linux系统来说其对外还提供FUSE 接口,其可以对外提供内核中的文件系统数据,供在用户态实现特殊的文件系统。



2. 微内核的VFS实现

微内核的VFS实现,一般会作为一个单独的用户态服务程序,特定的文件系统向此VFS服务进行注册,然后其他的业务通过此VFS服务查询到特定的文件系统的service,并且将访问请求redirect到特定文件系统的的用户态服务程序中,并对外提供文件系统的访问。

漫谈操作系统7 -- 一切皆为文件_第2张图片

你可能感兴趣的:(操作系统)