Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9464348
  • 博文数量: 1750
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 20091
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1750)

文章存档

2024年(26)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: LINUX

2009-02-06 17:47:57

看了一篇关于VFS工作原理性分析的文章,写的很不错,解开不少疑惑!!
按照原文的介绍的顺序写一些总结:
1.rootfs
这是特殊文件系统中的一种。显然像proc,devfs等都属于特殊文件系统。
rootfs顾名思义就是根文件系统。我一直在苦苦思索"/"到底在哪里生成的,现在终于找到答案了。
1)rootfs的注册:
首先每一种实际使用的文件系统类型都要注册,其实就是必须有一个该类型文件系统的struct file_system_type实例。
nit_rootfs() 通过调用 register_filesystem(&rootfs_fs_type)来向系统注册rootfs文件系统。
其中rootfs_fs_type是一个初始化好的struct file_system_type实例。
            struct file_system_type rootfs_fs_type = { \
                name:        "rootfs", \
                read_super:    ramfs_read_super, \
                fs_flags:    FS_NOMOUNT|FS_LITTER, \
                owner:        THIS_MODULE, \
             }
2)VFS目录树的建立。
首先VFS是一个以"/"为根的树型结构。它其实主要提供挂载点,具体的文件操作都是通过挂载点的具体文件系统来实现。
系统初始化时必须建立这个"/"。然后一切才可以开始。
首先回忆一下VFS的几种基本数据结构:
super_block,inode,dentry,vfsmount。作为根“/”,首先它是一个目录文件,所以应该有一个inode和一个dentry.
同时它一定属于某个文件系统,应该有超级块,并且要安装到文件系统中来。下面来看看这一切怎么处理的。
构造根目录的代码是在 init_mount_tree() 函数 (fs\namespace.c) 中。
init_mount_tree()完成了上述一堆工作:
<1>构造vfsmount的实例mnt。
每次安装一个具体的文件系统都需要一个vfsmount实例。主要定义了文件系统的设备,超级块,安装根路径等信息。
<2>分配一个super_block实例。
<3>调用rootfs_fs_type的read_super函数,即ramfs_read_super.
<4>ramfs_read_super函数分配一个inode结构实例。并初始化。主要设定其i_op,i_fop等。
<5>ramfs_read_super分配一个dentry目录项。名为"/".
<6>将 mnt中的mnt_sb指针指向sb,mnt_root和mnt_mountpoint指针指向dentry,而mnt_parent指针则指向自身。
这样VFS目录树就建立起来了。
所以跟想像中的差不多。并不是说从硬盘比如hda1中加载根文件系统就是说在没有"/"的情况下直接从硬盘里面读超级块,然后再建立根目录。当然,以前的情况是这样的。比如说以前看过的linux0.11版本。不过,相比VFS思想的抽象层次差很远。因为VFS支持一些像proc这样的内存文件系统。
2.关于加载根文件系统
不过问题出现了?这里根文件系统是系统自己构造出来的,类型是rootfs。经常说从硬盘上加载根文件系统是怎么回事呢???
按照对原文的理解,事情是这样的。VFS提供的目录树的根"/"是rootfs类型的。
在初始化的时候系统会把参数指定的根文件系统如/dev/hda1什么的安装到"/root"目录下。
然后将/root目录指定为init_task进程的当前目录和根目录。
而所有的进程都是由init进程直接或者间接的派生出来的,那么就对了!以后所有的用户进程都只能看到这个根目录下的文件了。

最后我还想到一个问题原文作者并未涉及到。
那就是系统启动后用户其实还能看到像/proc这些文件系统。而这个目录本来是在整个VFS的根目录下的。用户怎么能看到?
我想到的答案是连接。比如符号连接就行!
有待论证,望高手解答。。。

补:从这句代码sys_mount("/old", "/root/initrd", NULL, MS_MOVE, NULL);也许可以窥测些东西,系统应该是通过移动来做。比如:
sys_mount("/proc", "/root/proc", NULL, MS_MOVE, NULL);
这些是猜测,有待论证。
还有一点。就是proc在安装真的根文件系统之前还是之后建立起来的?如果之后,就不需要这么麻烦了!


参考文章(绝对好文!!):

1)解析 Linux 中的 VFS 文件系统机制http://www.ibm.com/developerworks/cn/linux/l-vfs/

2)Linux2.6 内核的 Initrd 机制解析
http://www.ibm.com/developerworks/cn/linux/l-k26initrd/

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