内核文件系统框架
来源:互联网 发布: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 结构中的方法
- 内核文件系统框架
- 内核文件系统
- LINUX内核和文件系统
- 内核与文件系统
- 内核挂载根文件系统异常
- 文件系统与内核
- Linux内核之文件系统
- linux内核之文件系统
- linux内核之文件系统
- 内核文件系统的注册
- 内核虚拟文件系统----configfs
- linux内核之文件系统
- linux内核之文件系统
- linux内核之文件系统
- linux内核之文件系统
- linux内核文件系统
- 内核-虚拟文件系统
- linux内核之文件系统
- UVa 11988 - Broken Keyboard (a.k.a. Beiju Text) 题解
- XAML代码设置附加属性
- 伯德证明你的财产与鸟网
- 如何编译自己的内核树
- 令人震惊的真相真金白银劫持
- 内核文件系统框架
- 如何通过sqlite加载数据到tableview
- android 拍照注意问题
- 数据结构(scheme) -- 抽象数据类型(ADT) -- 二叉查找树
- Web开发中的中文处理及乱码问题解决
- 从社会龙卷风租用iPhone游戏开发团队
- JAVA集合类List求交集
- TI_DSP_SRIO - Doorbell原理(中断路由到core-1)
- Git使用基础篇