在现代Linux系统中,网络是以文件系统的形式存在于内核中的,对于文件系统,我们首先要了解的就是VFS(virtual file system)。下图简单说明了VFS在文件系统中的作用:
VFS把系统底层众多具体的文件格式实现隐藏起来,向用户提供一组通用的调用接口(open/close/read/write等)。对于用户来说,这样做的好处是,用户不需要知道文件的真正格式就能对文件进行操作;对于操作系统,只要某个文件系统实现在VFS中注册,就能对用户提供服务,也就是说,系统对文件系统的支持是可以动态扩展的。
由于VFS的存在,Linux的文件系统十分强大,同时,也带来了“文件”概念的扩展。以前“文件”就是指“磁盘文件”,在储存在某种介质上的信息;现在,外部设备、网络系统、甚至某种服务(proc/epoll等),都是以文件的形式存在。
对于VFS,几个重要的数据结构是:file、file_operators、inode,下面简单说一下这几个数据结构的意义。
file结构体(在include/linux/fs.h中定义)
在内核中代表一个打开的文件,它由内核在文件open时创建,在文件close时释放。
file_operations结构体(在include/linux/fs.h中定义)
file_operations中保存着一系列的函数指针,它们分别和与其同名的系统调用相对应,像read/write/open等。每一个实际文件系统在向VFS注册时,都要填写一个file_operations结构,将里边的函数指针指向自己的文件操作函数实现。VFS在收到用户发来的文件操作系统调用时,首先找到file结构中的f_op,然后根据需要调用f_op中的函数,从而完成文件操作。
inode结构体(在include/linux/fs.h中定义)
即索引节点, 每一个物理文件(或目录)都有一个inode结构,它和file结构的区别在于:单个文件如果被多次打开的话,会创建多个file结构,但它们都指向同一个inode。file和inode是多对一的关系。