Chinaunix首页 | 论坛 | 博客
  • 博客访问: 615628
  • 博文数量: 120
  • 博客积分: 2284
  • 博客等级: 大尉
  • 技术积分: 1330
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-25 10:49
个人简介

http://guliqun1983.blog.163.com/blog/static/501116852011730535314/

文章分类
文章存档

2013年(23)

2012年(23)

2011年(74)

分类: LINUX

2013-04-24 10:30:36

声明:本文为原创
#####请转贴时保留以下内容######
作者GTT
本文档归属http://oldtown.cublog.cn/.转载请注明出处!
请提出宝贵意见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 就存在内存里了。各种数据结构和关系如下图, 一些双向链表被忽略了。否则图乱七八糟的。
 
 
 
 
 
 
 
 
 
 
 
 
 
 

阅读(1413) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~