声明:本文为原创
#####请转贴时保留以下内容######
作者:GTT
请提出宝贵意见Mail:mtloveft@hotmail.com
Linux Version:2.6.33
提示:本文是关于file system 实现的介绍!
这篇文章主要介绍rootfs
文件系统mount时需要提供一个目录,那最初这个目录从哪来的?分析文件系统,根文件系统是必须要分析的。
文件系统mount之后,是以树状形势存在kernel中的,既然是树,那么root就很重要了,有了root,就可以有枝和叶了。
rootfs是linux kernl启动时第一个mount的文件系统,它只存在内存里,之后kernel会加载initrd, initrd也仅存在内存里,
initrd是kernel在启动时加载的一个临时的文件系统,initrd里有些必要的工具。以后详细分析这个initrd。
然后kernel会根据配置,加载真正的根文件系统,调用chroot,以后所有的进程看到的都是真正的根文件系统,以后所有的进程都跟这个根系统文件关联,而和rootfs没有关系了。
rootfs 的注册却是通过 init_rootfs() 这一函数来完成,
被调用关系可以看下面的流程图
init_rootfs() 通过调用 register_filesystem(&rootfs_fs_type) 函数来完成 rootfs 文件系统注册的,其中rootfs_fs_type 定义如下:
static struct file_system_type rootfs_fs_type = { .name = "rootfs", .get_sb = rootfs_get_sb, .kill_sb = kill_litter_super, }
|
rootfs是kernel第一注册的文件系统,所以file_systems指向rootfs_fs_type, 而rootfs_fs_type的next字段为null,
注册完rootfs ,就对rootfs进行mount ,
是在init_mount_tree里调用do_kern_mount进行的。
Source code 分析在明明白白我的心--mount series里,具体过程就不贴了
主要处理流程介绍一下
1)调用 alloc_vfsmnt() ,在内存里创建了vfsmount一个实例,并初始化其部分成员变量。
2) 通过roofs注册的rootfs_get_sb调用get_sb_nodev() ,在内存里创建了super block一个实例.
并初始化它的一部分成员变量,利用s_instances加入到注册了的rootfs_fs_type的fs_supers双向链表里。
3) 利用super block 申请一个inode,过程在ramfs_get_inode里,以为这个inode 要作为根目录的inode
所以类型是S_IFDIR,inode 的操作vft和文件操作vft被分别设置为
inode->i_op = &ramfs_dir_inode_operations;
inode->i_fop = &simple_dir_operations;
以后的相应的系统调用中,对文件的操作都将转到这两个vft上。
4) 在调用d_alloc_root申请一个dentry ,把inode 和dentry关联起来,作为super 的根目录,
即s_root。并把inode 和dentry加入到各种双向链表里
Mount 之后rootfs 就存在内存里了。各种数据结构和关系如下图, 一些双向链表被忽略了。否则图乱七八糟的。
阅读(1455) | 评论(0) | 转发(0) |