在安装 ext2fs 的时候,存放 ext2 文件系统的磁盘分区上的大部分数据结构的信息都会被拷贝到 RAM( 操作系统内存 ) 中,从而使得内核避免了许多后续的操作,变得简单。由于 ext2 磁盘数据结构都保存在 ext2 磁盘分区的块中,所以当需要经常更新一些数据结构时,内核会利用页高速缓存来实现。

在实际mount一个文件系统的时候,ext2文件系统依赖于虚拟文件系统的一个标准函数(mount_bdev)来实现文件系统信息的装载。

由这个函数调用参数来看,安装ext2文件系统的时候最终会调用ext2_fill_super()函数来为super_block数据结构分配空间,并写入从磁盘读取的数据。ext2_fill_super()可以说是装载文件系统信息的时候的一个非常关键和核心的函数,它在fs/ext2/super.c中定义,关于改函数的代码总共有380多行,完全在此展现不恰当,但是,从对mount_bdev()的调用中可以看出,是将指向ext2_fill_super的一个函数指针传递给了mount_bdev,ext2_fill_super函数是用来填充VFS中一个超级块对象,如果内存中没有适当的超级块对象,数据就必须从硬盘读取。因此,可以说关于文件系统的装载过程主要知道ext2_fill_super函数就可以了。下面分析关于该函数源码:

首先有必要解释一下部分重要的设定的参数:

bh:指向页高速缓冲区首部的指针;

sbi:代表内存中ext2文件系统的超级块信息

es:磁盘上的ext2文件系统的超级块

root:VFS中的inode信息

要理解这个函数的实现,就要先理解页高速缓存。关于这部分我主要是看了这篇博文:http://blog.csdn.net/yunsongice/article/details/5850656。主要分析两大块的内容:如何将块存入页高速缓存以及如何从页高速缓存中搜索块。看了这两部分,了解了页高速缓存的工作机制和原理之后,在继续分析ext2_fill_super就稍微容易些了。

不过在整理ext2的超级块和块组中组描述符数据结构与页缓冲区的关系之前,有必要找出ext2在内存中的superblock数据结构中与缓冲区有关的域和字段:

(1)struct buffer_head * s_sbh;//这个指针指向包含磁盘超级块的缓冲区的缓冲区首部

(2)struct ext2_super_block * s_es;//该指针指向磁盘超级块所在的缓冲区

(3)unsigned long s_desc_per_block;//表示块组描述符的个数,可以存放在一个块中

(4)struct buffer_head ** s_group_desc;//这是一个二级指针,指向一个包含组描述符的缓冲区首部指针的数组。

关于ext2的超级块及块组描述符和缓冲区之间的关系可以大致描述为下图:

之前也有说到,当内核安装ext2文件系统的时候(mount命令),它会调用ext2_fill_super函数来为数据结构分配内存空间,并写入从磁盘读取的数据。

在前面已经列出了ext2_fill_super()函数中的相关变量的定义,接下来先画出该函数的代码流程:


具体解释:

首先用kzalloc分配一个内存中exct2文件系统的超级块描述符,将其地址作为参数传递并存放在超级块sb的s_fs_info字段中。事实上,ext2_fill_super()首先会设置一个初始的块大小,用来读取超级块,而由于文件系统中使用的块的大小此时并不知晓,所以内核首先会通过sb_min_blocksize查找最小的可能值。若块设备使用的最小块大小比sb_min_blocksize所设置的大,那么就设用块设备的设置。

接下来使用sb_bread读取超级块所在的数据块。实际上sb_bread是__bread函数的一个包装。然后就是要检查,以确保目前的分区实际上是不是包含了一个ext2文件系统。超级块中存储的magic域就保存了这部分检查所需要的信息。其值必须与EXT2_SUPER_MAGIC匹配。

parse_options用来分析用于指定装载选项的参数是否正确,在这步操作之前所有的值都设置为默认值,用以确保假如不知定选项,就等价于指定默认选项。

对文件系统特性的检查能够揭示内核是否能够装载改文件系统。、

如果保存在s_blocksize中的文件系统的块大小和最初指定的最小值并不匹配,那么使用sb_set_blocksize修改最初设置的块大小,并再次读取超级块所在的数据块。如果块大小与传输数据所用的块的大小相等,那么就可以使得内核的工作变简单很多,就可以一步读出一个文件系统块信息。

文件系统的元数据信息一直留在内存中,由ext2_sb_info数据结构来保存。元数据其实就是一些简单的值,只需要将数据从磁盘复制到数据结构对应的成员域即可。

接下来是读入文件系统的块组的组描述符的信息,并且使用ext2_check_descriptor检查一致性。

为了提高块分配的性能,ext2文件系统采用了一种称作预分配的机制,在这里就是在预留窗列表中添加了一项新的预留区,可以把预分配当作是最后块分配之前的一个附加层,用来判断如何充分利用可用空间。不过,预分配只是一个建议,真正的分配才是最终决定。

填充超级块的最后一步就是ext2_count_blocks,ext2_count_inodes,ext2_count_dirs分别计算空闲块、空闲inode以及空闲目录的数目。不过需要注意的是,这些值时报存在近似的计数器中,其初始值是正确的,但是在运转期间可能会有轻微的偏离。

然后,将控制权转交给ext2_setup_super,由它进行最后的检查并输出适当的警告信息,最后由ext2_write_super将超级块的内容写回到底层的存储介质上。
参考资料:
http://blog.csdn.net/yunsongice/article/details/5819323

EXT2的文件系统装载之内核函数ext2_fill_super分析相关推荐

  1. 鸟哥的Linux私房菜(基础篇)- 附录 B: EXT2 / EXT3 文件系统

    附录 B: EXT2 / EXT3文件系统 第二延伸文件系统 (EXT2) 全文出处: http://www.freeos.com/articles/3912/ 第二延伸文件系统(ext2)介绍 自从 ...

  2. FATFS文件系统框架及源码分析

    FATFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块.FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开.因此,它独立(不依赖)于硬件 ...

  3. 对于ARM的启动,系统升级,烧写过程和文件系统等方面的总结分析

    本文所述的ARM的指的是Cortex A系列以及ARM9,ARM11,跑Linux操作系统.对于CortexM系列并不一定完全适用: 谈到ARM以及启动和烧写等方面,首先我们要明确一下几个关键词:Ub ...

  4. JFFS2文件系统挂载过程优化的分析报告

    一 问题描述 在上电启动优化中发现Linux系统下挂载JFFS2文件系统耗时较长,以128M的NOR FLASH为例,用时接近20秒.后续单板的FLASH容量为256M,时间会更长.如此长的挂载时间, ...

  5. javascript php 性能,浅谈页面装载js及性能分析方法_javascript技巧

    一.装载 先装载静态页面的引用js文件,然后查找引用文件中是否包含onload函数,比如main.js中包含onload函数,在main.js中查找是否有对其他js文件的引用,优先装载引用js文件,被 ...

  6. linux fat32 乱码,FAT32文件系统乱码的研究和分析

    刘宏斌 摘 要 FAT32文件分配表是Windows操作系统磁盘分区格式的一种.采用32位的文件分配表,使其对磁盘的管理能力增强.本文通过文件系统出现乱码对FAT32的文件分配表进行研究和分析 关键词 ...

  7. 分布式持久内存文件系统Octopus(ATC-17 )分析(二)

    清华课题 Octopus 源码分析(二) 前言 论文摘要 设计框架 源码分析 include 头文件 Configuration.hpp common.hpp bitmap.hpp debug.hpp ...

  8. 分布式持久内存文件系统Octopus(ATC-17 )分析(三)

    清华课题 Octopus 源码分析(三) 前言 论文摘要 设计框架 源码分析 include 头文件 src 源文件 fs 模块 net 模块 client 模块 tools 模块 文件依赖关系分析 ...

  9. 分布式持久内存文件系统Octopus(ATC-17 )分析(一)

    清华课题 Octopus 源码分析一 前言 论文摘要 设计框架 源码分析 清华课题 Octopus 源码分析(一) 前言 由于项目工作的需要,我们团队阅读了清华在文件系统方面的一个比较新颖的工作:Oc ...

  10. 分布式持久内存文件系统Octopus(ATC-17 )分析(五)

    清华课题 Octopus 源码分析(五) 前言 论文摘要 设计框架 src目录源码分析 fs 模块 TxManager.cpp filesystem.cpp 清华课题 Octopus 源码分析(五) ...

最新文章

  1. LeetCode简单题之判断国际象棋棋盘中一个格子的颜色
  2. SVM进行手写数字识别
  3. ReentrantLock与synchronized
  4. 爬了下知乎上的高颜值小姐姐!美翻了!
  5. 高中上不上分数低学计算机,中考分数低该怎么办 上不了高中有什么出路
  6. java小知识_java小知识点简单回顾
  7. SpringSecurity案例之认证服务搭建
  8. Web 应用服务器端渲染入门指南
  9. windows消息机制-4(MFC)
  10. 判断一个字符串在另一个字符串中出现的次数
  11. 爱奇艺网络协程编写高并发应用实践
  12. CSS彻底研究(3) - 浮动,定位
  13. c语言编辑游戏时用哪个软件,我想用C语言编写一个小型游戏,使用什么软件
  14. ATtiny85简单引脚配置
  15. 轻松了解,顶级域名,二级域名,三级域名
  16. strtolower
  17. 对微信公众号JS安全域名的理解
  18. GBase 8c异地容灾
  19. Bagging和Boosting 策略及其区别
  20. UNIX发展史(BSD,GNU,linux)

热门文章

  1. [转]myeclipse 8.5最新注册码(过期时间到2016年)
  2. Silverlight制作scrollbar.
  3. 代理设计模式 实现 Retrofit 的 create
  4. whose view is not in the window hierarchy
  5. 【SICP练习】142 练习3.77
  6. hdu 2028 Lowest Common Multiple Plus(最小公倍数)
  7. 最简单的《域中隔离用户的FTP站点》详解
  8. 读《菜鸟学习***必看,不看别后悔》有感
  9. 线程---pthread_creat的问题
  10. 更改boot.ini自动进入DSRM模式