- 6
- 0
- 约3.3万字
- 约 28页
- 2016-02-25 发布于江苏
- 举报
Linux文件系统原理.doc
Linux文件系统原理
概述
要理解linux的文件系统,要从理解虚拟文件系统(VFS,Virtual Filesystem)开始。其结构可以用图表1来描述。
图表 1
虚拟文件系统
它到底是什么?是Linux内核中的一个软件层,用于给用户空间的程序提供文件系统接口。它也提供了内核中的一个抽象功能,允许不同的文件系统共存。注册和安装一个文件系统如果你想在内核中支持一种新的文件系统的话,你所需要做的仅仅是调用函数register_filesystem()。你向内核中传递一个描述文件系统实现 的结构(struct filesystem), 此结构将被加入到内核的支持文件系统表中去。你可以运行下面的命令:% cat /proc/filesystems
这样可以看到你的系统支持哪些文件系统。 module_init(),module_exit()。文件系统在作为模块被加载到内核时,调用register_filesystem(),把自己注册为一种文件系统。在模块被卸载时,调用unregister_filesystem()从内核中注消。以JFFS为例:
// 定义一种文件系统jffs_fs_type,其名称为“JFFS”
static DECLARE_FSTYPE_DEV(jffs_fs_type, jffs, jffs_read_super);
static int __init
init_jffs_fs(void)
{
printk(KERN_INFO JFFS version JFFS_VERSION_STRING
, (C) 1999, 2000 Axis Communications AB\n);
#ifdef CONFIG_JFFS_PROC_FS
jffs_proc_root = proc_mkdir(jffs, proc_root_fs);
#endif
fm_cache = kmem_cache_create(jffs_fm, sizeof(struct jffs_fm),
0, SLAB_HWCACHE_ALIGN, NULL, NULL);
node_cache = kmem_cache_create(jffs_node,sizeof(struct jffs_node),
0, SLAB_HWCACHE_ALIGN, NULL, NULL);
return register_filesystem(jffs_fs_type);
}
static void __exit
exit_jffs_fs(void)
{
// 注消文件系统
unregister_filesystem(jffs_fs_type);
kmem_cache_destroy(fm_cache);
kmem_cache_destroy(node_cache);
}
// 引出模块的加载和卸载时调用的接口
module_init(init_jffs_fs)
module_exit(exit_jffs_fs)
当一个mount请求出现时,VFS将会为特定的文件系统调用相应的方法。安装点的dentry结构将会被改为指向新文件系统的根i节点。
打开一个文件VFS实现了open系统调用。路径参数被VFS用来在目录入口缓存(dentry cache or dcache)。这提供了一个将路径名转化为特定的dentry的一个快的查找机制。
一个单独的dentry通常包含一个指向i节点(inode)的指针。i节点存在于磁盘驱动器上,它可以是一个规则文件,目录,FIFO文 件,等等。Dentry存在于RAM中,并且永远不会被存到磁盘上:它们仅仅为了提高系统性能而存在。i节点存在于磁盘上,当需要时被拷入内存中,之后对 它的任何改变将被写回磁盘。存在于RAM中的i节点就是VFS的i节点,dentry所包含的指针指向的就是它。dcache是你的整个文件空间的观察点。大多数不可能有足够的RAM空间来放我们的文件空间的所有文件的目录入口缓存(dentry)所以我们的dcache会有缺少的项。为了将路径名转换为一个dentryVFS不得不采取创建dentry的方式,并在创建dentry时将指针指向相应的i节点。这是通过对i节点的查找完成的。
为了查找一个文件的i节点(通常从磁盘上读),VFS需要调用该文件的父目录的lookup()方法,此方法是特定的文件系统所设置的。后面对此将会有更详尽的描述。
一旦VFS得到了所需要的dentry(同时也得到了相应的i节点),我们就能够对文件做想要的操作:打开文件,或者用stat来看 i节点中的数据。stat的操作非常简单:在VFS得到dentry之后,它取得inode中的
原创力文档

文档评论(0)