内核文件系统的注册
来源:互联网 发布:淘宝详情页和主图视频 编辑:程序博客网 时间:2024/05/17 22:05
内核将文件系统保存在一个静态全局变量中。位置在fs/filesystems.c
static struct file_system_type *file_systems;
在linux源码中,每种实际的文件系统都用以下的数据结构表示:
struct file_system_type {const char *name;int fs_flags;int (*get_sb) (struct file_system_type *, int, const char *, void *, struct vfsmount *);void (*kill_sb) (struct super_block *);struct module *owner;struct file_system_type * next;struct list_head fs_supers;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;};
struct file_system_type定义在include/linux/fs.h中
各个字段的含义:
- name:文件系统类型的名称,mount -t name /dev/abc /mnt,就是这个name
- fs_flags:文件系统类型标志
- get_sb:函数指针,读取超级块的方法
- kill_sb:函数指针,卸载超级块的方法
- owner:指向拥有这个结构的模块
- next:文件系统链表的下一个对象
- fs_supers:同一类型文件系统的超级块形成一个链表,fs_supers是这个链表的头
- 其他字段是一些相关的锁
不同的文件系统类型通过next连接形成单向链表,同一种文件系统类型的超级块通过都挂在双向链表fs_super上
rootfs的注册(不管怎么样,rootfs还是必须有的):
asmlinkage void __init start_kernel(void){。。。vfs_caches_init(num_physpages); 。。。}
void __init vfs_caches_init(unsigned long mempages){。。。mnt_init();。。。}
void __init mnt_init(void){。。。err = sysfs_init();if (err)printk(KERN_WARNING "%s: sysfs_init error: %d\n",__func__, err);fs_kobj = kobject_create_and_add("fs", NULL);if (!fs_kobj)printk(KERN_WARNING "%s: kobj create error\n", __func__);init_rootfs();init_mount_tree();}
int __init init_rootfs(void){int err;err = bdi_init(&ramfs_backing_dev_info);if (err)return err;err = register_filesystem(&rootfs_fs_type);if (err)bdi_destroy(&ramfs_backing_dev_info);return err;}init_rootfs定义在fs/ramfs/inode.c中,通过调用register_filesystem完成文件系统注册
rootfs文件系统的定义如下:
static struct file_system_type rootfs_fs_type = {.name= "rootfs",.get_sb= rootfs_get_sb,.kill_sb= kill_litter_super,};
文件系统的注册:
static struct file_system_type **find_filesystem(const char *name, unsigned len){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;}
int register_filesystem(struct file_system_type * fs){int res = 0;struct file_system_type ** p;BUG_ON(strchr(fs->name, '.'));if (fs->next)return -EBUSY;INIT_LIST_HEAD(&fs->fs_supers);write_lock(&file_systems_lock);p = find_filesystem(fs->name, strlen(fs->name));if (*p)res = -EBUSY;else*p = fs;write_unlock(&file_systems_lock);return res;}
register_filesystem:从全局变量file_systems中找到相同的文件系统,如果已经存在文件系统,说明已经注册过该文件系统,如果链表中不存在,就将该文件加入到链表中完成文件系统的注册,所以注册过程就是将文件系统的数据结构加入到全局的链表中。
文件系统的卸载:
int unregister_filesystem(struct file_system_type * fs){struct file_system_type ** tmp;write_lock(&file_systems_lock);tmp = &file_systems;while (*tmp) {if (fs == *tmp) {*tmp = fs->next;fs->next = NULL;write_unlock(&file_systems_lock);return 0;}tmp = &(*tmp)->next;}write_unlock(&file_systems_lock);return -EINVAL;}将文件系统从file_systems链表中删除
0 0
- 内核文件系统的注册
- 内核的文件系统的注册
- linux 文件系统模块的注册
- Linux内核网络协议栈1- socket文件系统注册
- 文件系统注册
- 文件系统-- 注册
- 文件系统注册
- uclinux内核的文件系统类型
- Android内核的根文件系统
- Android内核的根文件系统
- Android内核的根文件系统
- Android内核的根文件系统
- 内核和文件系统的区别
- 内核与文件系统的关系
- 内核和文件系统的关系
- linux文件系统的系统分析--(二)文件系统类型的注册
- linux文件系统的系统分析--(二)文件系统类型的注册
- linux文件系统的系统分析--(二)文件系统类型的注册
- hadoop简介
- WPF下、使用Double作为点坐标带来的问题或line直线颜色不明显的问题的解决方法
- 【MoreWindows工作笔记11】EnumClipboardFormats 剪切板内容的数据格式
- Lucene 的Query Parser(查询语法)
- TRUNC函数的用法
- 内核文件系统的注册
- Boost多线程编程
- 如何成为明星程序员
- 黑马程序员_SQL SERVER基础知识整理
- 进度更新&思路转换
- Android 扩展ImageView来播放gif动画
- jsp内置对象
- Boost Thread 编程指南
- iOS学习之 plist文件的读写