文件系统注册安装
使用文件系统前必须对文件系统进行注册和安装,下面分别对这两种行为做简要介绍。
文件系统的注册
VFS 要想能将自己定义的接口映射到实际文件系统的专用方法上,必须能够让内核识 别实际的文件系统,实际文件系统通过将代表自身属性的文件类型对象(file_system_type)注 册(通过 register_filesystem()函数)到内核,也就是挂到内核中的文件系统类型链表上,来达 到使文件系统能被内核识别的目的。反过来内核也正是通过这条链表来跟踪系统所支持的各 种文件系统的。 我们简要分析一下注册步骤: struct file_system_type { const char name; /文件系统的名字/ int fs_flags; /文件系统类型标志/ /下面的函数用来从磁盘中读取超级块/ struct super_block (read_super) (struct file_system_type , int, const char , void ); struct file_system_type next; /链表中下一个文件系统类型/ struct list_head fs_supers; /超级块对象链表*/ }; 其中最重要的一项是 read_super()函数,它用来从磁盘上读取超级块,并且当文件系统 被装载时,在内存中组装超级块对象。要实现一个文件系统首先需要实现的结构体便是 file_system_type 结构体。 注册文件系统只能保证文件系统能被系统识别,但此刻文件系统尚不能使用,因为它 还没有被安装到特定的安装点上。所以在使用文件系统前必须将文件系统安装到安装点上。 文件系统被实际安装时,将在安装点创建一个 vfsmount 结构体。该结构体用代表文件 系统的实例——换句话说,代表一个安装点。 vfsmount 结构被定义在(linux/mount.h)中,下面是具体结构
struct vfsmount
{
struct list_head mnt_hash; /*哈希表*/
struct vfsmount *mnt_parent; /*父文件系统*/
struct dentry *mnt_mountpoint; /*安装点的目录项对象*/
struct dentry *mnt_root; /*该文件系统的根目录项对象*/
struct super_block *mnt_sb; /*该文件系统的超级块*/
struct list_head mnt_mounts; /*子文件系统链表* /
struct list_head mnt_child; /*和父文件系统相关的子文件系统*/
atomic_t mnt_count; /*使用计数*/
int mnt_flags; /*安装标志*/
char *mnt_devname; /*设备文件名字*/
struct list_head mnt_list; /*描述符链表*/
};
文件系统如果仅仅注册,那么还不能被用户使用。要想使用它还必须将文件系统安装到特定 的安装点后才能工作。下面我们接着介绍文件系统的安装 7[7] 过程。