标签:lin fsmo filesyste 了解 ini class 文件系统 调用 ref
最近挂载了N多的文件系统,大致了不同文件系统的相应特性及挂载方式,却还是对Linux的文件系统没有从源码方面去了解。不求甚解确实不好不好。
于是借鉴一些大牛的博客及自己的理解,总结了博客系列:
VFS是Linux中的一个虚拟文件文件系统,也称为虚拟文件系统交换层(Virtual Filesystem Switch),是一种软件机制。它为应用程序员提供一层抽象,屏蔽底层各种文件系统的差异。如下图所示:
引入文件系统的目的是:为了屏蔽各种文件系统的差异
(1)VFS对实际文件系统进行抽象,采用统一的文件系统向用户提供相应的一组统一的标准的文件操作接口(open,read,close,select,poll等);
(2)通过系统调用到VFS到实际文件系统的操作。
(1)基于磁盘的文件系统;
(2)网络文件系统(NFS);
(3)伪文件系统(sysfs、proc);
VFS 目录树结构:
这里的文件系统是指可能会被挂载到目录树中的各个实际文件系统,所谓实际文件系统,即是指VFS 中的实际操作最终要通过它们来完成而已,并不意味着它们一定要存在于某种特定的存储设备上。比如在笔者的 Linux 机器下就注册有 "rootfs"、"proc"、"ext2"、"sockfs" 等十几种文件系统。
file_system_type 在include/linux/fs.h中:
1 struct file_system_type { 2 const char *name; 3 int fs_flags; 4 int (*get_sb) (struct file_system_type *, int, 5 const char *, void *, struct vfsmount *); 6 void (*kill_sb) (struct super_block *); 7 struct module *owner; 8 struct file_system_type * next; 9 struct list_head fs_supers; 10 struct lock_class_key s_lock_key; 11 struct lock_class_key s_umount_key; 12 };
注册过程实际上将表示各实际文件系统的 struct file_system_type 数据结构的实例化,然后形成一个链表,内核中用一个名为 file_systems 的全局变量来指向该链表的表头。
在众多的实际文件系统中,之所以单独介绍 rootfs 文件系统的注册过程,实在是因为该文件系统 VFS 的关系太过密切,如果说 ext2/ext3 是 Linux 的本土文件系统,那么 rootfs 文件系统则是 VFS 存在的基础。一般文件系统的注册都是通过 module_init 宏以及 do_initcalls() 函数来完成(读者可通过阅读module_init 宏的声明及 arch\i386\vmlinux.lds 文件来理解这一过程),但是 rootfs 的注册却是通过 init_rootfs() 这一初始化函数来完成,这意味着 rootfs 的注册过程是 Linux 内核初始化阶段不可分割的一部分。
init_rootfs() 通过调用 register_filesystem(&rootfs_fs_type) 函数来完成 rootfs 文件系统注册的,其中rootfs_fs_type 定义如下:(在fs/ramfs/inode.c)
1 struct file_system_type rootfs_fs_type = { 2 name: "rootfs", 3 read_super: ramfs_read_super, 4 fs_flags: FS_NOMOUNT|FS_LITTER, 5 owner: THIS_MODULE, 6 }
注册文件系统的函数:
1 int register_filesystem(struct file_system_type * fs)
注册之后的file system的链表结构图:
Reference:
https://www.ibm.com/developerworks/cn/linux/l-vfs/
标签:lin fsmo filesyste 了解 ini class 文件系统 调用 ref
原文地址:http://www.cnblogs.com/linhaostudy/p/7397024.html