您的位置:首页 > 运维架构 > Linux

《Linux内核设计与实现》读书笔记(十三)- 虚拟文件系统

2017-08-24 18:25 211 查看
虚拟文件系统(VFS)是linux内核和具体I/O设备之间的封装的一层共通访问接口,通过这层接口,linux内核可以以同一的方式访问各种I/O设备。

虚拟文件系统本身是linux内核的一部分,是纯软件的东西,并不需要任何硬件的支持。

主要内容:

虚拟文件系统的作用

虚拟文件系统的4个主要对象

文件系统相关的数据结构

进程相关的数据结构

小结

1. 虚拟文件系统的作用

虚拟文件系统(VFS)是linux内核和存储设备之间的抽象层,主要有以下好处。

- 简化了应用程序的开发:应用通过统一的系统调用访问各种存储介质

- 简化了新文件系统加入内核的过程:新文件系统只要实现VFS的各个接口即可,不需要修改内核部分

2. 虚拟文件系统的4个主要对象

虚拟文件中的4个主要对象,具体每个对象的含义参见如下的详细介绍。

2.1 超级块

超级块(super_block)主要存储文件系统相关的信息,这是个针对文件系统级别的概念。

它一般存储在磁盘的特定扇区中,但是对于那些基于内存的文件系统(比如proc,sysfs),超级块是在使用时创建在内存中的。

超级块的定义在:<linux/fs.h>

struct files_struct {
atomic_t count;      /* 使用计数 */
struct fdtable *fdt; /* 指向其他fd表的指针 */
struct fdtable fdtab;/* 基 fd 表 */
spinlock_t file_lock ____cacheline_aligned_in_smp; /* 单个文件的锁 */
int next_fd;                                       /* 缓存下一个可用的fd */
struct embedded_fd_set close_on_exec_init;         /* exec()时关闭的文件描述符链表 */
struct embedded_fd_set open_fds_init;              /* 打开的文件描述符链表 */
struct file * fd_array[NR_OPEN_DEFAULT];           /* 缺省的文件对象数组 */
};


View Code
struct fs_struct 位于:<linux/fs_struct.h>

struct fs_struct {
int users;               /* 用户数目 */
rwlock_t lock;           /* 保护结构体的读写锁 */
int umask;               /* 掩码 */
int in_exec;             /* 当前正在执行的文件 */
struct path root, pwd;   /* 根目录路径和当前工作目录路径 */
};


struct mmt_namespace 位于:<linux/mmt_namespace.h>

但是在2.6内核之后似乎没有这个结构体了,而是用 struct nsproxy 来代替。

以下是 struct task_struct 结构体中关于文件系统的3个属性。

struct task_struct 的定义位于:<linux/sched.h>

/* filesystem information */
struct fs_struct *fs;
/* open file information */
struct files_struct *files;
/* namespaces */
struct nsproxy *nsproxy;


5. 小结

VFS 统一了文件系统的实现框架,使得在linux上实现新文件系统的工作变得简单。

目前linux内核中已经支持60多种文件系统,具体支持的文件系统可以查看 内核源码 fs 文件夹下的内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: