分类

linux内核文件系统框架详细介绍

浏览量:260 日期:2014-07-06 09:17:33
内容介绍

  随着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用户学习与操作有所帮助。

相关阅读
手机版 | 电脑版
Copyright @ 2021 豆豆系统