在linux内核中的文件管理模块中,VFS机制居功至伟,VFS是virtual file system的缩写,表示为虚拟文件系统,它可以实现在Linux操作系统中可以同时有多个不同的文件系统在工作,并且不同文件系统之间的差异性对应用层是完全透明的。VFS本身并不是一种技术,而是多种技术手段和数据结构的集合,比如对进程抽象文件管理,如果将系统文件管理转换成对文件外存的块管理,如何加快对文件的操作,诸如这些所有,加在一起,就形成一种文件管理的机制,把这种机制中的一个中间部分,由内核来主要管理的、不依赖于具体的文件系统和驱动的、只提供接口不实现操作的部分,称为VFS机制。
这篇博文讨论内核中文件系统的注册。
一,文件系统往哪注册
在说明文件系统注册之前,先了解一些文件系统往哪注册,这本质上是内核如何管理所有已经被注册的文件系统。就是如果要添加一个文件系统至操作系统,此时内核将这个文件系统的信息将要保存在什么地方?
内核将文件系统保存在一个全局变量中,在源码文件filesystems.c文件中定义:
static struct file_system_type *file_systems;
这是一个全局变量,保存所有的已经被系统注册的文件系统,所以可以想像到struct file_system_type肯定要维护链表之类的存储结构。
二,数据结构
每一个需要被注册的文件系统由下面的结构表示:
struct file_system_type {
const char *name;
int fs_flags;
int (*get_sb) (struct file_system_type *, int,
const char *, void *, struct vfsmount *);
void (*kill_sb) (struct super_block *);
struct module *owner;
struct file_system_type * next;
struct list_head fs_supers;
struct lock_class_key s_lock_key;
struct lock_class_key s_umount_key;
struct lock_class_key i_lock_key;
struct lock_class_key i_mutex_key;
struct lock_class_key i_mutex_dir_key;
struct lock_class_key i_alloc_sem_key;
};
对上面结构的字段说明如下:
- name:文件系统的名称。
- fs_flags:文件系统的属性和有些特性的设置。
- next:这个容易理解,维护链表上的多个文件系统。
- fs_supers:表示给定文件系统所对应的超级块链表的头结点,这里要理解超级块对象,可以先简单的理解成文件系统需要管理很多的外存储(就是硬盘等存储设备),在格式化成分区之后,就是一个文件系统了,但还是有很多空间可以被使用(如120G),此时超级块就是这个文件系统的一个使用目录,其实就是包含了很多的管理和存储空间登记的信息。fs_supers指向系统中相同文件系统的超级块对象的链表。
- get_sb:这是一个函数指针,依赖于具体的文件系统来实现,表示分配一个超级块对象并初始化或者读取一个已经存在的超级块对象。
- kill_sb:删除一个超级块对象。
- owner:指向实现文件的模块的指针,因为文件系统可以在源码中直接实现,也可以由模块来安装。
- 其它字段:其它的都是一些锁的字段。
三,文件系统的注册
以rootfs文件系统的注册为例,这个文件系统是在系统初始化期间注册的,调用路径如下:
asmlinkage void __init start_kernel(void)
{
。。。。。。
vfs_caches_init(num_physpages);
。。。。。。
}
void __init vfs_caches_init(unsigned long mempages)
{
。。。。。。
mnt_init();
。。。。。。
}
void __init mnt_init(void)
{
。。。。。。
init_rootfs();
。。。。。。
}
int __init init_rootfs(void)
{
int err;
err = bdi_init(&ramfs_backing_dev_info);
if (err)
return err;
err = register_filesystem(&rootfs_fs_type);
if (err)
bdi_destroy(&ramfs_backing_dev_info);
return err;
}
rootfs文件系统的定义如下:
static struct file_system_type rootfs_fs_type = {
.name = "rootfs",
.get_sb = rootfs_get_sb,
.kill_sb = kill_litter_super,
};
然后能过调用register_filesystem完成文件系统的注册,这个定义比较简单,作为另一个文件系统,定义如下:
static struct file_system_type ext2_fs_type = {
.owner = THIS_MODULE,
.name = "ext2",
.get_sb = ext2_get_sb,
.kill_sb = kill_block_super,
.fs_flags = FS_REQUIRES_DEV,
};
上面的结构实例就是EXT2文件系统,本文不讨论这个文件系统的注册过程,但终究肯定是调用register_filesystem函数完成注册。
int register_filesystem(struct file_system_type * fs)
{
int res = 0;
struct file_system_type ** p;
BUG_ON(strchr(fs->name, '.'));
if (fs->next)
return -EBUSY;
INIT_LIST_HEAD(&fs->fs_supers);
write_lock(&file_systems_lock);
p = find_filesystem(fs->name, strlen(fs->name));
if (*p)
res = -EBUSY;
else
*p = fs;
write_unlock(&file_systems_lock);
return res;
}
static struct file_system_type **find_filesystem(const char *name, unsigned len)
{
struct file_system_type **p;
for (p=&file_systems; *p; p=&(*p)->next)
if (strlen((*p)->name) == len &&
strncmp((*p)->name, name, len) == 0)
break;
return p;
}
上面的过程比较简单,就是从全局变量file_systems中找到相同的文件系统,如果已经存在文件系统,说明已经注册过该文件系统,如果链表中不存在,就将该文件加入到链表中完成文件系统的注册,所以注册过程就是将文件系统的数据结构加入到全局的链表中。
四,文件系统的卸载
卸载过程比较简单,调用unregister_filesystem函数完成:
int unregister_filesystem(struct file_system_type * fs)
{
struct file_system_type ** tmp;
write_lock(&file_systems_lock);
tmp = &file_systems;
while (*tmp) {
if (fs == *tmp) {
*tmp = fs->next;
fs->next = NULL;
write_unlock(&file_systems_lock);
return 0;
}
tmp = &(*tmp)->next;
}
write_unlock(&file_systems_lock);
return -EINVAL;
}
这个过程就是将文件系统的数据结构实例从全局的链表中删除。
分享到:
相关推荐
2.3 文件系统的注册与安装 38 2.3.1 文件系统类型注册 38 2.3.2 文件系统安装数据结构 41 2.3.3 安装普通文件系统 52 2.3.4 分配超级块对象 58 2.3.5 安装根文件系统 60 2.3.6 卸载文件系统 65 2.4 路径名的查找 66 ...
10介绍VFS原理,超级块,inode结构和方法,dentry结构和方法,file结构和方法,以及进程打开文件表,linux中的文件系统。(2小时) 11讲解块设备缓冲,bio结构,I/O请求队列,和有最终期限的块I/O调度算法。(2...
8.4 文件系统的注册、安装与拆卸 8.4.1 文件系统的注册 8.4.2 文件系统的安装 8.4.3 文件系统的卸载 8.5 限额机制 8.6 具体文件系统举例 8.6.1 管道文件系统pipefs 8.6.2 磁盘文件系统BFS 8.7 文件系统的...
目录 1 引子 2 1.1 上电 2 1.2 BIOS时代 3 1.3 内核引导程序 5 2 内核映像的形成 8 ...5.12.3 安装proc文件系统 296 6 后start_kernel时代 298 6.1 创建1号进程 298 6.2 子系统的初始化 306 6.3 启动shell环境 309
本书从Windows内核编程出发,全面系统地介绍了串口、键盘、磁盘、文件系统、网络等相关的Windows内核模块的编程技术,以及基于这些技术实现的密码保护、防毒引擎、文件加密、网络嗅探、网络防火墙等信息安全软件的...
的大小 82 7.2 虚拟文件系统 83 7.2.1 VFS文件系统的超级块 84 7.2.2 VFS文件系统的inode节点 84 7.2.3 注册文件系统 85 7.2.4 装配文件系统 85 7.2.5 在虚拟文件系统中查找文件 87 7.2.6 卸载...
8.4 文件系统的注册、安装与拆卸 8.5 限额机制 8.6 具体文件系统举例 8.7 文件系统的系统调用 8 .8 Linux2.4文件系统的移植问题 第九章 Ext2文件系统 9.1 基本概念 9.2 Ext2的磁盘布局和数据结构 9.3 文件的访问权限...
这个例了同时也展示了sysfs文件系统在驱动程序中的用法,以及通过Linux设各模型来创建设备节点及其他一些特性(这个看起来很简单的内核模块其实体现了设备驱动程序中一些比较重要且典型的特征)。 首先是设备驱动程序...
本书从Windows内核编程出发,全面系统地介绍了串口、键盘、磁盘、文件系统、网络等相关的Windows内核模块的编程技术,以及基于这些技术实现的密码保护、防毒引擎、文件加密、网络嗅探、网络防火墙等信息安全软件的...
7.2.3 注册文件系统 85 7.2.4 装配文件系统 85 7.2.5 在虚拟文件系统中查找文件 87 7.2.6 卸载文件系统 87 7.2.7 VFS文件系统的inode缓存 87 7.2.8 目录缓存 88 7.3 缓冲区缓存 88 7.3.1 bdflush内核守护进程 90 ...
本书从Windows内核编程出发,全面系统地介绍了串口、键盘、磁盘、文件系统、网络等相关的Windows内核模块的编程技术,以及基于这些技术实现的密码保护、防毒引擎、文件加密、网络嗅探、网络防火墙等信息安全软件的...
本书从Windows内核编程出发,全面系统地介绍了串口、键盘、磁盘、文件系统、网络等相关的Windows内核模块的编程技术,以及基于这些技术实现的密码保护、防毒引擎、文件加密、网络嗅探、网络防火墙等信息安全软件的...
11.3.2 注册文件系统变动回调 208 11.3.3 文件系统变动回调的一个实现 209 11.3.4 文件系统识别器 211 11.4 文件系统控制设备的绑定 212 11.4.1 生成文件系统控制设备的过滤设备 212 11.4.2 绑定文件系统控制...
本书从Windows内核编程出发,全面系统地介绍了串口、键盘、磁盘、文件系统、网络等相关的Windows内核模块的编程技术,以及基于这些技术实现的密码保护、防毒引擎、文件加密、网络嗅探、网络防火墙等信息安全软件的...
本书从Windows内核编程出发,全面系统地介绍了串口、键盘、磁盘、文件系统、网络等相关的Windows内核模块的编程技术,以及基于这些技术实现的密码保护、防毒引擎、文件加密、网络嗅探、网络防火墙等信息安全软件的...
深入研究Windows内部原理系列之十一:存储和文件系统 讲师信息:高宇 2007年02月08日 14:00-15:30 Level: 400 课程将在宏观上简要介绍Windows的存储体系, 观察磁盘上的扇区怎样变成用户眼中的文件. 然后深入观察...
pbootcms提供了小程序基本接口,但是没有会员登录注册接口,本人开发了注册以及登录接口,供大家使用,本接口文件为全新增加,不影响原有系统更新,直接复制粘贴就可以使用。 登录接口:...
11.3.2 注册文件系统变动回调 208 11.3.3 文件系统变动回调的一个实现 209 11.3.4 文件系统识别器 211 11.4 文件系统控制设备的绑定 212 11.4.1 生成文件系统控制设备的过滤设备 212 11.4.2 绑定文件系统控制...
制作的动态网站类似于一个教务管理系统,用户通过注册、登录进入个人信息在网站上进行浏览,浏览即是从数据库获取数据,显示到网页,也可以通过对数据库修改更新网站内容,进而实现动态网页。那么需要安装apeche2、...
3.3.1 Android对Linux内核文件的改动 62 3.3.2 为Android构建 Linux的操作系统 63 3.4 内核空间和用户空间接口是一个媒介 64 3.4.1 内核空间和用户空间的相互作用 64 3.4.2 系统和硬件之间的交互 ...