Linux内核源代码阅读---filesystem.c

本文档详细介绍了Linux内核源代码中fs/filesystems.c的内容,主要涉及文件系统的挂载和卸载功能。核心函数register_filesystem和unregister_filesystem分别用于挂载和卸载文件系统,通过在file_systems链表中添加和移除文件系统类型结构体。同时,文中解释了如何查找并加载文件系统,以及如何通过系统调用sysfs执行不同操作。通过对源代码的分析,展现了Linux内核如何管理不同文件系统。
摘要由CSDN通过智能技术生成

 

该文件位于源码中的fs/中:

      在Linux中是使用mount和umount指令来安装和卸载(或者说是挂载和卸载)文件系统的,一旦改变文件系统,那么在文件系统中的一些接口和处理函数也会发生相应的改变。在使用诸如open、read等系统调用的时候,内核是先调用VFS的通用系统调用,然后再找到当前文件系统的种类,然后具体的调用该文件系统的对应的函数来实现具体的功能,而下面的这个文件就是完成安装和卸载文件系统的功能。

      在最新内核版本(2.6.36.1)中filesystems.c文件位于内核源代码下的 fs/ 里,代码共286行,虽然比较短小,但是承担的任务还是比较重要的,其中的register_filesystem函数就是完成mount的功能,unregister_filesystem函数是完成umount的功能。

      源代码分析:

 

/*

 *  linux/fs/filesystems.c

 *

 *  Copyright (C) 1991, 1992  Linus Torvalds

 *

 *  table of configured filesystems

 */

#include <linux/syscalls.h>

#include <linux/fs.h>

#include <linux/proc_fs.h>

#include <linux/seq_file.h>

#include <linux/kmod.h>

#include <linux/init.h>

#include <linux/module.h>

#include <linux/slab.h>

#include <asm/uaccess.h>

static struct file_system_type *file_systems;

/*

该结构体定义在include/linux/fs.h中:

struct file_system_type {

        const char *name;//文件系统的名称

        int fs_flags;//标志位

        int (*get_sb) (struct file_system_type *, int,

                       const char *, void *, struct vfsmount *);

得到super block的函数,在security/inode.c中实现:

static int get_sb(struct file_system_type *fs_type,

                  int flags, const char *dev_name,

                  void *data, struct vfsmount *mnt)

{

        return get_sb_single(fs_type, flags, data, fill_super, mnt);

该函数在fs/super.c中实现,得到系统的super block。

}

        void (*kill_sb) (struct super_block *);//删除super block

        struct module *owner;//模块所有者

        struct file_system_type * next;//类似链表,下一个文件类型

        struct list_head fs_supers;//文件系统super的一个链

        struct lock_class_key s_lock_key;

        struct lock_class_key s_umount_key;

        struct lock_class_key s_vfs_rename_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;

/*

lock_class_key在/include/linux/lockdep.h中定义:

struct lock_class_key {

      struct lockdep_subclass_key     subkeys[MAX_LOCKDEP_SUBCLASSES];

*/

};

应该是一个类似于锁的一种对文件系统更换操作时进行加锁保护的一些变量。

*/

static DEFINE_RWLOCK(file_systems_lock);

/*

该宏在include/linux/rwlock_types.h中定义:

#define DEFINE_RWLOCK(x)        rwlock_t x = __RW_LOCK_UNLOCKED(x)

大概就是为文件系统进行加锁的操作

*/

void get_filesystem(struct file_system_type *fs)

{

__module_get(fs->owner);

}

/*

该函数是用来加载文件系统模块的,其中的函数在include/linux/module.h中定义:

static inline void __module_get(struct module *module)

{

        if (module) {

                preempt_disable();

                __this_cpu_inc(module->refptr->incs);

                trace_module_get(module, _THIS_IP_);

                preempt_enable();

        }

}

具体实现不用搞懂,只要知道它是把module模块加载到内核中。

*/

void put_filesystem(struct file_system_type *fs)

{

module_put(fs->owner);

}

/*

该函数是用来卸载文件系统模块的,其中函数定义在ke

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值