疯狂内核之文件系统
文章平均质量分 88
yunsongice
这个作者很懒,什么都没留下…
展开
-
虚拟文件系统
现在我们的主流价值观是社会和谐、世界和谐。同样,Linux成功的关键因素之一是它具有与其他操作系统和谐共存的能力。你能够透明地安装具有其他操作系统文件格式的磁盘或分区,这些操作系统如Windows、其他版本的Unix,甚至像Amiga那样的市场占有率很低的系统。通过所谓的虚拟文件系统概念,Linux使用与其他Unix变体相同的方式设法支持多种文件系统类型。虚拟文件系统所隐含的思想是把表示很多不同种类文件系统的共同信息放入内核;其中有一个字段或函数来支持Linux所支持的所有实际文件系统所提供的任何操作。原创 2010-06-01 19:19:00 · 5524 阅读 · 2 评论 -
Ext2数据块分配
<br />跟索引节点一样,Ext2也对磁盘数据块进行分配与释放。在详细分析相关代码之前,先引出两个重要的预备,一个是数据块寻址,一个是文件的洞<br /> <br /> 1 数据块寻址<br /> <br /> <br />每个非空的普通文件都由一组数据块组成。这些块或者由文件内的相对位置(它们的文件块号)来标识,或者由磁盘分区内的位置(它们的逻辑块号)来标识。<br /> <br />从文件内的偏移量 f 导出相应数据块的逻辑块号需要两个步骤:<br />1. 从偏移量f导出文件的块号,即在偏移量f处的原创 2010-08-18 23:19:00 · 5754 阅读 · 1 评论 -
创建Ext2文件系统
<br />在磁盘上创建一个文件系统通常有两个阶段。第一步格式化磁盘,以使磁盘驱动程序可以将块号转换成对应的磁道和扇区,从而可以读和写磁盘上的物理块。现在的硬磁盘已经由厂家预先格式化,因此不需要重新格式化;在Linux上可以使用superformat或fdformat等实用程序对软盘进行格式化。第二步才涉及创建文件系统,这意味着建立前面博文中详细描述的那些磁盘文件系统数据结构。<br /> <br />Ext2文件系统是由C程序mke2fs创建的。mke2fs采用下列缺省选项,用户可以用命令行的标志修改这些原创 2010-08-18 22:50:00 · 2519 阅读 · 0 评论 -
Ext2的索引节点对象
<br />上一篇博文我们详细分析了VFS如何将具体文件系统ext2的超级快对象缓存到内存中,主要是利用了ext2_sb_info数据结构。ext2_fill_super函数最后的时候,会将传入该函数的super_block类型的参数sb赋予以下的值:<br /> sb->s_op = &ext2_sops;<br /> <br />其中,ext2_sops是将super_block的super_operations初始化以下方法的集合:<br />static struct super_oper原创 2010-08-17 22:34:00 · 3195 阅读 · 0 评论 -
Ext2的超级块对象
<br />前面我们详细讨论了将一个磁盘分区格式化成ext2文件系统后,一个分区的布局,重点介绍了超级快、块组、位图和索引节点等内容。那么,内核如何跟这些ext2文件系统的对象打交道呢?这个,才是我们研究存储的人应该重点关注的对象,从本篇博文开始,我们就来重点讨论。<br /> <br />首先,当安装Ext2文件系统时(执行诸如mount -t ext2 /dev/sda2 /mnt/test的命令),存放在Ext2分区的磁盘数据结构中的大部分信息将被拷贝到RAM中,从而使内核避免了后来的很多读操作。那么原创 2010-08-17 21:17:00 · 5244 阅读 · 2 评论 -
Ext2的方法总结
<br />在“VFS对象”博文中所描述的关于VFS的很多方法在Ext2都有相应的实现。因为对所有的方法都进行讨论需要整整一本书,因此我们仅仅简单地回顾一下在Ext2中所实现的方法。一旦你真正搞明白了磁盘和内存数据结构,你就应当能理解实现这些方法的Ext2函数的代码。<br /> 1 Ext2超级块的操作<br /> <br />在“Ext2的索引节点对象”我们已经分析了Ext2超级块的操作之一:ext2_alloc_inode,这里在对Ext2超级块的操作做一个综合性的总结。很多VFS超级块操作在Ext2原创 2010-08-18 22:56:00 · 2036 阅读 · 0 评论 -
磁盘高速缓存
<br />相信通过前面的虚拟文件系统VFS及一个具体的Ext2文件系统博文,大家对基本的VFS体系有一个大致的掌握了吧。从本章开始,我们将讨论一些VFS底层的技术细节,磁盘高速缓存就是其中一个重要的技术。磁盘高速缓存是一种软件机制,它允许系统把通常存放在磁盘上的一些数据保留在RAM中,以便对那些数据的进一步访问而不用再访问磁盘。<br /> <br />因为对同一磁盘数据的反复访问频繁发生,所以磁盘高速缓存对系统性能至关重要。与磁盘交互的用户态进程有权反复请求读或写同一磁盘数据。此外,不同的进程可能也需要原创 2010-08-23 22:33:00 · 8299 阅读 · 0 评论 -
页高速缓存处理函数
<br />好了,在了解了页高速缓存相关的数据结构以后,我们来介绍一下基本的页高速缓存处理函数:<br /> <br />对页高速缓存操作的基本高级函数有查找、增加和删除页。在以上函数的基础上还有另一个函数确保高速缓存包含指定页的最新版本。<br /> 1 查找页<br /> <br />函数find_get_page()接收的参数为指向address_space对象的指针和偏移量。它获取地址空间的自旋锁,并调用radix_tree_lookup()函数搜索拥有指定偏移量的基树的叶子节点:<br />str原创 2010-08-23 22:42:00 · 6082 阅读 · 0 评论 -
在页高速缓存中搜索块
<br />当内核需要读或写一个单独的物理设备块时(例如一个超级块),必须检查所请求的块缓冲区是否已经在页高速缓存中。在页高速缓存中搜索指定的块缓冲区(由块设备描述符的地址bdev和逻辑块号nr表示)的过程分成三个步骤:<br /> <br />1. 获取一个指针,让它指向包含指定块的块设备的address_space对象(bdev->bd_inode->i_mapping)。<br /> <br />2. 获得设备的块大小(bdev->bd_block_size),并计算包含指定块的页索引。这需要在逻辑块原创 2010-08-30 22:00:00 · 4529 阅读 · 1 评论 -
把块存放在页高速缓存中
<br />VFS(映射层)和各种文件系统以叫做“块”的逻辑单位组织磁盘数据。在Linux内核的旧版本中,主要有两种不同的磁盘高速缓存:页高速缓存和缓冲区高速缓存,前者用来存放访问磁盘文件内容时生成的磁盘数据页,后者把通过VFS(管理磁盘文件系统)访问的块的内容保留在内存中。<br /> <br />从2.4.10的稳定版本开始,缓冲区高速缓存其实就不存在了。事实上,由于效率的原因,不再单独分配块缓冲区;相反,把它们存放在叫做“缓冲区页”的专门页中,而缓冲区页保存在页高速缓存中。<br /> <br />缓原创 2010-08-30 20:51:00 · 5788 阅读 · 0 评论 -
Ext2索引节点分配
<br />文件在磁盘的存储不同于程序员所看到的文件,主要表现在两个方面:块可以分散在磁盘上(尽管文件系统尽力保持块连续存放以提高访问速度),以及程序员看到的文件似乎比实际的文件大,这是因为程序可以把洞引人文件(通过lseek ()系统调用)。<br /> <br />从本篇博文开始,我们将介绍Ext2文件系统如何管理磁盘空间,也就是说,如何分配和释放索引节点和数据块。有两个主要的问题必须考虑:<br /> <br />(1)空间管理必须尽力避免文件碎片,也就是说,避免文件在物理上存放于几个小的、不相邻的盘原创 2010-08-18 23:06:00 · 4172 阅读 · 2 评论 -
VFS系统调用的实现
<br />至此,虚拟文件系统中主要的数据结构,以及最重要的path_lookup()函数我们都讲完了,那么就可以来讨论VFS的系统调用是如何实现的了。<br /> <br />当然,一篇博文讨论所有的系统调用是不现实的,所以我们不打算对所有VFS系统调用的实现进行讨论,这里只讲讲“开、读、写、关”四大VFS系统调用,而且是粗略的流程,请重点关注VFS的数据结构怎样互相用。至于其中的细节,由于涉及到页缓存、回收页框、mmap、块设备驱动等,别急,相关博文会来个详细分解的。<br /> <br />我们重新考原创 2010-06-22 00:30:00 · 3687 阅读 · 2 评论 -
VFS对象数据结构
<br />前面讲了,为了使各种文件系统和谐相处,内核提供了一个通用的虚拟文件模型。本博,我们就重点讨论组成这个通用文件模型的那些对象的数据结构。<br /> <br />每个VFS对象都存放在一个恰当的数据结构中,其中包括对象的属性和指向对象方法表的指针。内核可以动态地修改对象的方法,因此可以为对象建立专用的行为。<br /> <br />所有的VFS对象都放在include/linux/Fs.h中。<br /> 1 超级块对象<br /> <br />超级块对象由super_block结构组成:<br原创 2010-06-02 12:41:00 · 3813 阅读 · 0 评论 -
文件系统安装预备知识
<br />就像每个传统的Unix系统一样,Linux也使用系统的根文件系统(system's root filesystem):它由内核在引导阶段直接安装,并拥有系统初始化脚本以及最基本的系统程序。<br /> <br />其他文件系统要么由初始化脚本安装,要么由用户直接安装在已安装文件系统的目录上。作为一个目录树,每个文件系统都拥有自己的根目录(root directory)。安装文件系统的这个目录称之为安装点(mount point)。已安装文件系统属于安装点目录的一个子文件系统。例如,/proc虚拟原创 2010-06-21 23:44:00 · 2909 阅读 · 0 评论 -
路径名查找(续)
<br />上一篇博文我们分析了极其复杂的路径名查找流程,如果实在看不懂,还是用老方法,先理清相关的数据结构,然后再在纸上画一画。相信大家都欣赏到了Linux内核的复杂性了吧,不过事儿还没完呢,我们还留了两个尾巴,一个是父路径名查找问题,还有一个就是符号链接的查找问题,不过呢,如果上一篇文章你大致上读懂了话,这两个东西也不难。<br /> 1 父路径名查找<br /> <br />在很多情况下,查找操作的真正目的并不是路径名的最后一个分量,而是最后一个分量的前一个分量。例如,当文件被创建时,最后一个分量表示原创 2010-06-22 00:09:00 · 2524 阅读 · 0 评论 -
Ext2磁盘数据结构
要学习ext2文件系统,首先要学习ext2的磁盘设计,也就是说,ext2将一个磁盘分区格式化成一个什么样子。本篇博文就来介绍一下一个ext2文件系统的磁盘分区布局,重点关注它的数据结构。任何Ext2分区中的第一个块从不受Ext2文件系统的管理,因为这一块是为分区的引导扇区所保留的。Ext2分区的其余部分分成块组(block group),每个块组的分布图如图所示。正如你从图中所看到的,一些数据结构正好可以放在一块中,而另一些可能需要更多的块。在Ext2文件系统中的所有块组大小相同并被顺序存放,因此,内核可以原创 2010-06-22 10:10:00 · 4346 阅读 · 2 评论 -
把Linux中的VFS对象串联起来
<br />上一篇博文讲到了内核提供的通用虚拟文件模型中四大数据结构极其操作,那么,为了使各种文件系统和谐相处,这些对象又是怎么串联起来的呢。本博,我们就重点讨论他们怎样与内核交互,包括如何与进程打交道,以及介绍一些相关的缓存机制。<br /> 1 与进程相关的文件<br /> <br />首先,文件必须由进程打开,每个进程都有它自己当前的工作目录和它自己的根目录。这仅仅是内核用来表示进程与文件系统相互作用所必须维护的数据中的两个例子。类型为fs_struct的整个数据结构就用于此目的,且每个进程描述符ta原创 2010-06-21 14:52:00 · 5343 阅读 · 1 评论 -
文件系统注册
<br />前面主要把VFS对象,以及他们如何串联起来的内容介绍得差不多了。相信走大现在,大家对大概的VFS工作机制有了相应的了解,接下来要做的事,就是把那些重要的细节描述清楚。首先,Linux内核支持很多不同的文件系统类型。本篇博文,我们将讨论文件系统注册——也就是通常在系统初始化期间并且在使用文件系统类型之前必须执行的基本操作。一旦文件系统被注册,其特定的那些虚拟文件模型中的对象中的函数对内核就是可用的了,因此文件系统类型可以安装在系统的目录树上。<br /> <br />接下来,我们再介绍一些特殊的文原创 2010-06-21 22:07:00 · 2434 阅读 · 0 评论 -
文件系统安装
<br />上一篇博文我们详细讲解了与文件系统安装相关的数据结构,现在我们就来谈谈一个特定的文件系统是怎么安装的。<br /> 1 安装普通文件系统<br /> <br />在sys_mount中调用do_mount()函数执行文件系统安装实务:<br />retval = do_mount((char *)dev_page, dir_page, (char *)type_page,<br /> flags, (void *)data_page);<br /> <br />do_mount()函数通原创 2010-06-21 23:54:00 · 3418 阅读 · 0 评论 -
Ext2的一般特征
<br />前面对虚拟文件系统VFS的讨论就告一段落了,VFS主要是提供一个系统调用接口,然后将相关文件系统对象与具体的文件系统串联起来。从本篇博文开始,我们将选择一个具体的文件系统进行研究,这个文件系统就是第二扩展文件系统(Ext2)。为啥要特别学习这个东西呢?因为ext2是Linux所固有的,事实上已在每个Linux系统中得以使用,因此我们自然要对Ext2进行讨论。此外,Ext2在对现代文件系统的高性能支持方面也显示出很多良好的实践性。固然,Linux支持的其他文件系统有很多有趣的特点,但比较扩展文件系原创 2010-06-22 09:45:00 · 2020 阅读 · 1 评论 -
路径名查找
当进程必须识别一个文件时,就把它的文件路径名传递给某个VFS系统调用,如open()、mkdir()、rename()或stat()。我们这里要说明VFS如何实现路径名查找,也就是说如何从文件路径名导出相应的索引节点。执行这一任务的标准过程就是分析路径名并把它拆分成一个文件名序列。除了最后一个文件名以外,所有的文件名都必定是目录。如果路径名的第一个字符是“/”,例如:/usr/share/system-configure-ext2/test.conf,那么这个路径名是绝对路径,因此从current->fs-原创 2010-06-22 00:02:00 · 3450 阅读 · 1 评论 -
把脏页写入磁盘
<br />正如我们所了解的,内核不断用包含块设备数据的页填充页高速缓存。只要进程修改了数据,相应的页就被标记为脏页,即把它的PG_dirty标志置位。<br /> <br />Unix系统允许把脏缓冲区写入块设备的操作延迟执行,因为这种策略可以显著地提高系统的性能。对高速缓存中的页的几次写操作可能只需对相应的磁盘块进行一次缓慢的物理更新就可以满足。此外,写操作没有读操作那么紧迫,因为进程通常是不会由于延迟写而挂起,而大部分情况都因为延迟读而挂起。正是由于延迟写,使得任一物理块设备平均为读请求提供的服务将多原创 2010-08-30 22:07:00 · 6799 阅读 · 1 评论