您的位置:首页
话说文件系统——aufs源码分析(三)【转】
2018-05-11 14:58
1216 查看
本文转载自:http://www.cnblogs.com/xie0812/p/8848185.html
1. linux中设备驱动的入口都是:module_init(xxx_init);里面注册的函数,对于文件系统来说也是一样的,对于aufs来说,就是aufs_init,具体如下
2. struct file_system_type结构体在(kernel)/include/linux/fs.h中。每个注册到内核中的文件系统都有一个这样的结构体来表示,如下:
3. (kernel)/fs/filesystems.c register_filesystem函数主要的作用就是通过在在内核中搜索是否要注册的文件系统是否已经注册过了,如果没有
就注册到系统中,其实所谓注册,就是把对应的file_system_type结构体添加到全局的file_systems变量组成的链表中。每个file_system_type不是
有next成员吗,就是通过next把系统中的所有文件系统链接到一起的。
4. find_filesystem((kernel)/fs/filesystems.c)函数在系统中通过所注册文件系统的名字,通过简单的字符串比对的方式找是否在系统中已经注册了。
这也可以说,文件系统的名字必须得唯一,这里需要注意的是:这个函数的返回值是指针的指针,正是由于这样,在register_filesystem函数中
可以改变find_filesystem函数返回的值,也是把要注册的文件系统添加到链表中了
5. 把文件系统中注册到链表中后,register_filesystem函数的使命就结束了。注册就这么简单?没错,没有花眼,其实重头戏在kern_mount函数中,
这个函数位于:(kernel)/include/linux中,是一个宏定义(#define kern_mount(type) kern_mount_data(type, NULL)),好吧,看来kern_mount只是
kern_mount_data函数穿了一件外套,那就看看我们的真大神吧。
6. vfs_kern_mount这个函数主要的目的就是分配struct mount、aufs文件系统的根目录dentry、aufs的super_block,同时对其初始化,且把它们相互
联系起来
7. mount_fs函数中根据条件创建和初始化了aufs文件系统的super_block和根目录的dentry,其实真真是通过执行aufs_get_sb这个函数
创建的,这个函数中更多的是把aufs_get_sb函数返回的dentry和super_block进行处理
8. 视线转移到aufs_get_sb吧,这个函数只是调用了mount_single函数,不过注意,aufs_fill_super函数作为参数传递给了mount_single。
9. 在我们实现的aufs文件系统的super_block和根目录dentry都是从这个函数中得到
10. 到这个地方已经是胜利在望了,我们继续跟踪一下sget这个函数,它是怎么创建aufs的super_block的。其实file_system_type中
维护着一个以fs_supers的super_block链表,对应我们的aufs_type,当然我们的aufs_type中此成员设置为NULL,那么也就会创建一个
super_block,同时把aufs_type的对应创建的super_block添加到aufs_type中fs_supers链表中,同时把分配的super_block添加到内核维
护的一个全局super_block链表中
11. sget函数执行完之后,我们就得到了aufs_type对应的super_block,但是aufs对应的根目录的dentry还没有着落了,我们回到第9步,还记得吗,
我们在第9步说fill_super这个函数,对应aufs的aufs_fill_super函数
12. simple_fill_super从名字就可以看出来,主要是填充对应文件系统的super_block的,也会在这个函数创建aufs的根目录的dentry和inode,
当然这创建的这两个结构体也是为填充对应的super_block结构体嘛
13. 到这里我们的aufs文件系统的super_block,根目录dentry和inode已经创建完成,且已经做了各种初始化,同时也把它们相互关联
起来了。在VFS的框架中,一个文件必须与一个inode结构体对应起来,必须有一个或者更多的dentry与inode对应起来,当然,在linux
中文件夹也是一种特殊的文件。哇塞,这么神奇啊,我们的aufs文件的雏形已经出来了,其实没有多么的复杂,我们要学会把复杂的问题
剖解成简单的、容易的来做,这样往往能达到不错的效果,也不至于因为一点都弄不明白,就放弃了。好吧,下一篇我们继续分析aufs
文件系统中是怎么创建文件夹和文件的。
1. linux中设备驱动的入口都是:module_init(xxx_init);里面注册的函数,对于文件系统来说也是一样的,对于aufs来说,就是aufs_init,具体如下
就注册到系统中,其实所谓注册,就是把对应的file_system_type结构体添加到全局的file_systems变量组成的链表中。每个file_system_type不是
有next成员吗,就是通过next把系统中的所有文件系统链接到一起的。
这也可以说,文件系统的名字必须得唯一,这里需要注意的是:这个函数的返回值是指针的指针,正是由于这样,在register_filesystem函数中
可以改变find_filesystem函数返回的值,也是把要注册的文件系统添加到链表中了
这个函数位于:(kernel)/include/linux中,是一个宏定义(#define kern_mount(type) kern_mount_data(type, NULL)),好吧,看来kern_mount只是
kern_mount_data函数穿了一件外套,那就看看我们的真大神吧。
联系起来
创建的,这个函数中更多的是把aufs_get_sb函数返回的dentry和super_block进行处理
维护着一个以fs_supers的super_block链表,对应我们的aufs_type,当然我们的aufs_type中此成员设置为NULL,那么也就会创建一个
super_block,同时把aufs_type的对应创建的super_block添加到aufs_type中fs_supers链表中,同时把分配的super_block添加到内核维
护的一个全局super_block链表中
我们在第9步说fill_super这个函数,对应aufs的aufs_fill_super函数
当然这创建的这两个结构体也是为填充对应的super_block结构体嘛
起来了。在VFS的框架中,一个文件必须与一个inode结构体对应起来,必须有一个或者更多的dentry与inode对应起来,当然,在linux
中文件夹也是一种特殊的文件。哇塞,这么神奇啊,我们的aufs文件的雏形已经出来了,其实没有多么的复杂,我们要学会把复杂的问题
剖解成简单的、容易的来做,这样往往能达到不错的效果,也不至于因为一点都弄不明白,就放弃了。好吧,下一篇我们继续分析aufs
文件系统中是怎么创建文件夹和文件的。
相关文章推荐
- 话说文件系统——aufs源码分析(三)
- 文件系统(四)--pipe.c read_write.c stat.c fcntl.c ioctl.c源码分析
- Linux内核源码分析-卸载文件系统-sys_umount
- Linux内核源码分析--文件系统(二、高速缓存区)
- Glusterfs文件系统简介和源码简单分析
- Linux内核源码分析--文件系统(九、File_dev.c)
- 【Flume】【源码分析】flume中sink到hdfs,文件系统频繁产生文件,文件滚动配置不起作用?
- 文件系统(二)--buffer.c namei.c truncate.c open.c源码分析
- Hadoop源码分析笔记(十二):名字节点--文件系统目录树
- Linux内核源码分析--文件系统(七、Namei.c)
- DataNode文件系统源码分析 推荐
- 第二人生的源码分析(四十三)虚拟文件系统线程
- Linux内核源码分析--文件系统(六、Super.c)
- UBIFS文件系统源码分析
- Linux内核源码分析--文件系统(四、Bitmap.c)
- Linux proc 的文件系统的源码分析
- Linux内核源码分析--文件系统(八、Block_dev.c)
- Linux内核源码分析-安装实际根文件系统- prepare_namespace
- f2fs——新型flash友好文件系统gc部分源码分析
- Linux内核源码分析-安装普通文件系统-mount系统调用