内核文件系统框架

来源:互联网 发布:js 运算符重载 编辑:程序博客网 时间:2024/05/29 21:34

在这我以linux-2.6.22的内核   ext3文件系统为例

现在的linux越来越强大,功能越来越多,支持的系统的格式随之增加,那怎么知道我手中的内核本身已经支持哪些文件系统呢?如果你对内核目录的结构了解的话,就很轻松的能找到,他们就在根目录的fs下,如果自己想要的文件系统没有支持的,就需要自己去移植了,这是后话,下面就看看这些文件系统在内核中是怎样工作的

在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  结构中的方法


         

0 0
原创粉丝点击