随着linux系统不断的改变,现在的linux越来越强大,功能越来越多,支持的系统的格式随之增加,那怎么知道我手中的内核本身已经支持哪些文件系统呢?如果你对内核目录的结构了解的话,就很轻松的能找到,他们就在根目录的fs下,如果自己想要的文件系统没有支持的,就需要自己去移植了,这是后话,下面就看看这些文件系统在内核中是怎样工作的。
linux内核文件系统框架详细介绍,在这里豆豆以linux-2.6.22的内核 ext3文件系统为例
在fs/ext3/Super.c中
1:出入口函数
init_ext3_fs //入口
register_filesystem(&ext3_fs_type); //注册
exit_ext3_fs //出口
unregister_filesystem(&ext3_fs_type); //卸载
我是怎么知道这是出入口函数的呢,相信做驱动程序的再熟悉不过了,那就是他们了
module_init(init_ext3_fs)
module_exit(exit_ext3_fs)
下面重点看看 ext3_fs_type 和 register_filesystem
2:上面提到的 ext3_fs_type
static struct file_system_type ext3_fs_type = {
.owner = THIS_MODULE,
.name = "ext3", //名字
.get_sb = ext3_get_sb, //挂载时
.kill_sb = kill_block_super, //卸载
.fs_flags = FS_REQUIRES_DEV,
};
这是个 file_system_type 结构体
在挂载时,调用get_sb方法;卸载时,调用kill_sb方法,这些都是和具体的文件系统的格式相关的,在这先不分析
3:register_filesystem 在fs/Filesystems.c中
register_filesystem
INIT_LIST_HEAD //初始化链表
write_lock
p = find_filesystem(fs->name, strlen(fs->name)); //检测是不是已经支持了该文件系统,有则break,无则返回,在这不太好理解的关键在于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;
if (*p)
res = -EBUSY;
else
*p = fs; //如果还没有支持该文件系统,则添加支持
return res; //如果还没支持返回0,应经支持返回 -EBUSY
这样就完成了注册。
下面在看看系统是怎么来调用的
4:sys_sysfs 在fs/Filesystems.c中
sys_sysfs(int option, unsigned long arg1, unsigned long arg2)
case 1: fs_index
for (tmp=file_systems, index=0 ; tmp ; tmp=tmp->next, index++) {
if (strcmp(tmp->name,name) == 0) {
err = index;
break;
}
} //通过比较 name 来确定使用哪个类型的文件系统
case 2: fs_name
case 3: fs_maxindex
综上来说,一共有两条主线。
1:通过配置内核来设定可以支持哪些文件系统,ok后这些文件系统通过 register_filesystem 一一注册,这是在系统启动的过程中就已经处理完了
2:通过 sys_sysfs 系统调用来选择使用已经注册好的哪一个文件系统,最终去执行该文件系统对应的 file_system_type 结构中的方法
linux系统内核文件框架就介绍到这里,希望对linux用户学习与操作有所帮助。