注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

易拉罐的博客

心静自然凉

 
 
 

日志

 
 

转 Linux内核中EXT2文件系统实现  

2011-01-18 20:05:18|  分类: 嵌入式系统 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
        对文件系统而言, 文件仅是一系列可读写的数据块。文件系统并不需要了解数据块应该放置到物理介质上什么位置,这些都是设备驱动的任务。无论何时只要文件系统需要从包含它的块设备中读取信息或数据,它将请求底层的设备驱动读取一个基本块大小整数倍的数据块。EXT2文件系统将它所使用的逻辑分区划分成数据块组。每个数据块组将那些对文件系统完整性最重要的信息复制出来,同时将实际文件和目录看作信息与数据块。

        在Linux中,普通文件和目录文件保存在称为块物理设备的磁盘或磁带上。每个文件系统由逻辑块的序列组成,一个逻辑盘空间一般划分为几个用途各不相同的部分,即引导块、超级块、inode区以及数据区等。

  • 引导块: 在文件系统的开头通常为一个扇区,其中存放引导程序,用于读入并启动操作系统。
  • 超级块(super_block) : 用于记录文件系统和管理信息。特定的文件系统定义了特定的超级块。ext2是由很多块组组成。每个块组最前面的是超级块,文件系统首先要获取的是块组0的超级块,其实每个块组的超级块相同。但没有办法首先获取其他的超级块。第一个超级块=start_sect (分区表里ext2文件系统的开始扇区)+ 2。
  • inode区(索引节点):一个文件(或目录)占据一个索引节点。第一个索引节点是该文件系统的根节点。利用根节点,可以把一个文件系统挂在另一个文件系统的非叶节点上。
  • 数据区:用于存放文件数据或者管理数据(如一级间址块、二级间址块等)。
通过VFS的超级块(struct ext2_sb_info ext2_sb)可以访问EXT2的超级块,通过VFS的inode(struct ext2_inode_info ext2_I)可以访问EXT2的inode。

        逻辑文件系统管理的是一个逻辑空间,这个逻辑空间就象一个大的数组,数组的每个元素就是文件系统操作的基本单位-逻辑块。逻辑块是从0开始编号,而且,逻辑块是连续的,逻辑块相对的是物理块。通常,EXT2的物理块占一个或几个连续的扇区。

图 8 1:EXT2磁盘布局在逻辑空间的映像
一般,只有块组0的超级块才读入内存,其他块组的超级块仅仅作为备份。在系统运行期间,要将超级块复制到内存系统缓冲区内。

块位图和节点位图

在EXT2文件系统中,采用位图来描述数据块和索引节点的使用情况,每个块组中占用两个块,即一个用来描述该数据块的使用情况,另一个描述该组索引节点的使用情况。这两个块分别称为数据位图块和索引节点位图块。数据位图块中的每一位表示该块组中的每一个块的使用情况,如果为0,则表示相应数据块空闲,如果为1,则表示已分配。索引节点位图块的使用情况一样。一个块组的最大可能空间就是一个块大小的8K倍。即如果块大小为1K,则块组大小为8K*1K=8G,节点个数也最多为8G个。

EXT2文件系统安装后,内核用两个高速缓存管理这两种位图块。每个高速缓存最多同时只能装入EXT2_MAX_GROUP_LOADED个位图块或索引节点块,当前该值定义为8,因而必须采用一些算法管理这两个高速缓存,EXT2文件系统中采用的算法类似于LRU算法。

在include/linux/ext2_fs_sb.h中有ext2_sb_info结构,其中有四个域与管理块位图、节点位图相关,列出如下:
struct ext2_sb_info {   ……   unsigned long s_inode_bitmap_number[EXT2_MAX_GROUP_LOADED];   struct buffer_head * s_inode_bitmap[EXT2_MAX_GROUP_LOADED];   unsigned long s_block_bitmap_number[EXT2_MAX_GROUP_LOADED];   struct buffer_head * s_block_bitmap[EXT2_MAX_GROUP_LOADED];   ……  };

ext2_sp_info结构中用上面四个域用来管理这两个高速缓存,其中s_block_bitmap_number[]数组中存有进入高速缓存的块位图块号(即块组号,因为一个块组中只有一个块位图),而s_block_bitmap[]数组则存储了相应的块在高速缓存中的地址。举例来说,对于块大小为1K的系统来说,高速缓存可标识8*8*1k*1k=64G的使用情况。

s_inode_bitmap_number[]和s_inode_bitmap[]数组的作用类似上面。

索引节点表

每个块组中的索引节点都存储在各自的索引节点表中,并且按索引节点号依次存储。索引节点表通常占好几个数据块,索引节点表所占的块使用时也像普通的数据块一样被调入块高速缓存。

ext2整个硬盘的逻辑结构如下:

转 Linux内核中EXT2文件系统实现 - 易拉罐bb - 易拉罐的博客
 
图 8 2:硬盘的ext2系统逻辑结构图
 http://www.shangshuwu.cn/index.php/Linux%E5%86%85%E6%A0%B8%E4%B8%ADEXT2%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%AE%9E%E7%8E%B0#
  评论这张
 
阅读(589)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017