自己设计文件系统

zhenghn2010 2011-08-12 03:55:53
文件系统是某些操作系统必然包含的模块,对系统中存储介质的访问以同一的系统接口进行管理,完成read ,write,ioctl等操作。
按照实现方式,可分为传统的单机版的文件系统和网络分布式的文件系统。
分布式文件系统通常应用网络技术和协议,将分散的各个数据资源进行同一管理的系统形式。
嵌入式操作系统上的文件系统,或者说传统的文件系统一般是单一的本地数据管理系统。例如常用的FAT Ext2 yaffs 等。
这里说的就是这种传统的文件系统。

目前有许多成熟的和开源的文件系统,通用型的或者针对具体应用场合的。根据自己系统的需要选取成熟的文件系统,是最可取的一种方式。但是有时为了提高系统性能,往往根据自己的需要对文件系统进行改进甚至自己实现一个理想的文件系统,也是非常必要的。这里就是结合文件系统实现的基本原理,结合一个针对流媒体存储文件系统的应用例子,来描述一下自己实现的文件系统的原理,希望能够起到抛砖引玉的作用。

一般的存储介质包括hdd, flash,eeprom,ram...... 根据不同硬件介质的特性,在保证正确可靠,高性能的情况下,都有特定的文件系统支持。这里以在hdd块设备上实现文件系统为例。其实文件系统完全可以屏蔽底层驱动接口,但不同的硬件特性,可以有特定的文件系统,还是有点区别,这里就不详细说明。

就如其他模块设计一样,首先要保证系统正确可靠,然后是想法提高系统性能。在这样的设计思想下,如何针对自己对文件访问的应用,设计出合理可靠的存储结构和高效的访问机制,是系统设计的关键。

一般说,在介质加载的起始地方,肯定要包含文件系统的基本信息(有的还有boot信息,包括分区信息)。在此基础上,建立起文件系统目录结构。由驱动提供的访问函数,根据目录文件的信息,访问相应的数据节点。访问的基本单位是簇(块),包含多个sector。.基本访问单元大小和每个sector大小,可以根据需要进行设置。这个往往根据数据存储情况和访问情况,在sector浪费和访问费用之间进行平衡,也就是空间和时间平衡的关系。

在流媒体应用领域,在硬盘上对数据的存储一般一次性存储是比较大的。针对这个特点,可以设计出自己的一个流媒体文件系统。

将硬盘分区上划分为supper block(文件系统信息表)+FAT(文件分配表)+Data(数据区)。以sector为最小单位(一般512bytes),
|supper block| FAT |data
supper block占用了一个sector. 其包含了文件系统类型,版本号;本分区的大小;文件分配表大小;申请单元大小;
根目录index; 分配表个数;参考分配表index; 备份supper block lsn; 分配表lsn; 数据区lsn.
当系统mount时,根据supper block 信息,找到参考文件分配表,将参考文件分配表内容拷贝到工作分配表中。其中的原理是,系统可以有多个文件分配表相互备份,至少有2个。一个是参考文件分配表,一个是工作文件分配表。当文件信息更新(用户命令和系统定时更新)完成后,此刻的工作文件分配表信息认为是可靠的,可以将其设置为参考文件分配表,而将原来的参考分配表或者其他的设置为工作分配表,并拷贝完最新数据。这样,能够保证文件分配表数据的完整性。即使在操作过程中有掉电行为,也可以将原来的完整参考分配表恢复回来。
根据root index和文件分配表,找到根目录所在的文件分配信息sector,并可以对出相应的数据,进而建立起目录树。

FAT中包含多个文件(目录)记录。一个记录为一个sector.一个FAT的大小,可以根据实际要用到的文件个数和数据区的大小来设置。一个文件记录里包含本记录的类型(文件,目录,扩展),名称,文件属性(日期,访问权限,所有者),长度,文件节点,父节点,内容sector的lsn,扩展extension记录.根据open传递的文件名称,找到相应的文件FAT记录,进而得到文件节点。根据FAT记录就可以找到数据内容的lsn,进行数据访问了。相应管理也可以根据记录里的其他属性进行工作。其中的内容lsn可以记录多个连续的分配单元给本文件使用。这样适用于碎片比较多的情况。当文件比较大碎片比较多的时候,一个记录不够用,可以再申请一个记录,叫扩展extension记录来继续进行数据申请区的记录管理。这样根据每个文件的FAT记录,就可以找到其名称等属性和数据记录区。

数据区就是一系列的连续(也可以不连续,但要保证基本申请单元大小n*sector)的块区域组成。一般块设备是按sector划分,每块512bytes. 这里的分配空闲管理,是在系统加载时通过扫描每个FAT记录里数据区的使用情况建立的。其每个申请单元情况对应使用情况表的一位来标识。在format时可以根据每个数据块的读情况标识好坏。由于管理数据块使用空闲情况的表是建立在内存中的,所以这个表象不能太大,或者每个管理单元要大些。在流媒体文件,一般是以兆为单位的,所以可以为4M,8M等。有的文件系统,如FAT,将这个结构也放到文件分配表里,存储到硬盘上,在需要时再读出来。

到此,硬盘上用到的数据结构设计完成,完全可以保证数据访问的可靠性和正确性。

还要采取些访问措施,来提高系统访问性能。

首先可以建立一个cache机制,申请一段内存,将最近访问的文件记录放入其中,这样再次访问时,可以从内存中查找记录提高性能。
其次可以建立一个申请窗口机制。就是在为每个文件申请内容sector时,多申请一些在一个window里记录下来。这样再此用到数据sector时,可以快速得到,提高性能。
最后,也是所有块设备访问的基本机制,就是命令队列。将每个访问以命令的方式下发,系统可以根据需要进行QOS或者其他方式进行处理,提高系统对不同命令等级的处理性能。

总之,文件系统实现是离不开文件系统基本原理的,完全可以根据自己的需要来修改,甚至实现。抛开这些神秘的面纱,还原其原来面目。我们也可以做得到。

草草完成,简单阐述,不对之处,望多指出讨论。
...全文
289 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
codesnail 2011-08-16
  • 打赏
  • 举报
回复
不错,感谢分享。
JuanA1 2011-08-16
  • 打赏
  • 举报
回复
顶了,不过感觉不够具体,要是有代码就好了
miaotuqin 2011-08-16
  • 打赏
  • 举报
回复
learned
李迟 2011-08-16
  • 打赏
  • 举报
回复
以前有一段时间对文件系统很有兴趣,现在提不起激情了,等哪天有闲心再研究研究。
zhenghn2010 2011-08-16
  • 打赏
  • 举报
回复
自己总结的,我sina blog上的 呵呵。希望与大家分享
cqbamboo 2011-08-16
  • 打赏
  • 举报
回复
这是你自己总结的?建议发到你的blog上
huangxiaohu_coder 2011-08-14
  • 打赏
  • 举报
回复
顶,学习了
DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题设计,可以完美修复该问题。本程序中包含了最新版的DirectX redist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。 本程序为了应对一般电脑用户的使用,采用了傻瓜式一键设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难度。 本程序适用于多个操作系统,如Windows XP(需先安装.NET 2.0,详情请参阅“致Windows XP用户.txt”文件)、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows 8.1 Update、Windows 10,同时兼容32位操作系统和64位操作系统。本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。 本程序的V3.3版分为标准版、增强版以及在线修复版。其中的标准版以及增强版都包含完整的DirectX组件。除此之外,增强版中还额外包含了c++ Redistributable Package,因此增强版不但能解决DirectX组件的问题,而且还能解决c++组件异常产生的问题。增强版适合无法自行解决c++相关问题的用户使用。在线修复版的功能与标准版相同,只是其所需的文件将通过Internet下载,因此大大减小了程序的体积。本程序的各个版本之间,主程序完全相同,只是配套使用的数据包不同。因此,当您使用标准版数据包时,程序将进行标准修复;当您使用增强版的数据包时,程序将进行增强修复;当数据包不全或没有数据包(即只有DirectX Repair.exe程序)时,程序将进行在线修复。在线修复、离线修复可自由灵活组合,充分满足不同用户的需要。 本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本的程序时不会再出现自我校验失败的错误;但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。 程序有自动更新c++功能。由于绝大多数软件运行时需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同时,也会根据需要更新系统中的c++组件。自V3.2版本开始使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。修复c++的功能仅限于增强版,标准版及在线修复版在系统c++异常时(非丢失时)会提示用户使用增强版进行修复。 程序有两种窗口样式。正常模式即默认样式,适合绝大多数用户使用。另有一种简约模式,此时窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。 程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。同时,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行写一个需要修复文件的序号即可。该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式时无效)。 本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问题时,及时分析和查找原因,以便找到解决办法。 程序的“选项”对话框中包含了4项高级功能。点击其中的“注册系统文件夹中所有dll文件”按钮可以自动注册系统文件夹下的所有dll文件。该项功能不仅能修复DirectX的问题,还可以修复系统中很多其他由于dll未注册而产生的问题,颇为实用。点击该按钮旁边的小箭头,还可以注册任意指定文件夹下的dll文件,方便用户对绿色版、硬盘版的程序组件进行注册。点击第二个按钮可以为dll文件的右键菜单添加“注册”和“卸载”项,方便对单独的dll文件进行注册。请注意,并不是所有的dll文件都可以通过这种方式注册。点击“DirectX版本”选项卡可以自行修改系统中DirectX的版本信息。点击“DirectX加速”选项卡可以控制系统中DirectX加速的开启与关闭。 新版程序集成了用户反馈程序,可以在用户允许的前提下发送检测修复结果。用户也可以在出现问题时通过反馈程序和软件作者进行交流,共同查找问题。反馈是完全自愿和匿名(如果不填写E-mail地址)的。 本程序的通用版基于Microsoft .NET Framework 2.0开发,对于Windows 2000、Windows XP、Windows 2003的用户需要首先安装.NET Framework 2.0或更高版本方可运行本程序。有关下载和安装的详细信息请参阅“致Windows XP用户.txt”文件。对于Windows Vista、Windows 7及后续用户,可以直接运行本程序。 同时鉴于Windows 8(Windows 8.1、Windows 8.1 Update)、Windows 10系统中默认未包含.NET Framework 2.0,因此新版的程序文件夹内将包含一个DirectX_Repair_win8的特别版程序,该程序功能与通用版相同,基于.NET Framework 4.0开发,可以在Windows8(Windows 8.1、Windows 8.1 Update)、Windows 10系统中直接运行(其他系统如果安装了.NET Framework 4.0也可以运行这个特别版的程序)。 本程序的官方博客地址为:http://blog.csdn.net/vbcom/article/details/6962388 所有的更新以及技术支持都可以到该博客上找到。
DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题设计,可以完美修复该问题。本程序中包含了最新版的DirectX redist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。 本程序为了应对一般电脑用户的使用,采用了傻瓜式一键设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难度。 本程序适用于多个操作系统,如Windows XP(需先安装.NET 2.0,详情请参阅“致Windows XP用户.txt”文件)、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows 8.1 Update、Windows 10,同时兼容32位操作系统和64位操作系统。本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。 本程序的V3.3版分为标准版、增强版以及在线修复版。其中的标准版以及增强版都包含完整的DirectX组件。除此之外,增强版中还额外包含了c++ Redistributable Package,因此增强版不但能解决DirectX组件的问题,而且还能解决c++组件异常产生的问题。增强版适合无法自行解决c++相关问题的用户使用。在线修复版的功能与标准版相同,只是其所需的文件将通过Internet下载,因此大大减小了程序的体积。本程序的各个版本之间,主程序完全相同,只是配套使用的数据包不同。因此,当您使用标准版数据包时,程序将进行标准修复;当您使用增强版的数据包时,程序将进行增强修复;当数据包不全或没有数据包(即只有DirectX Repair.exe程序)时,程序将进行在线修复。在线修复、离线修复可自由灵活组合,充分满足不同用户的需要。 本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本的程序时不会再出现自我校验失败的错误;但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。 程序有自动更新c++功能。由于绝大多数软件运行时需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同时,也会根据需要更新系统中的c++组件。自V3.2版本开始使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。修复c++的功能仅限于增强版,标准版及在线修复版在系统c++异常时(非丢失时)会提示用户使用增强版进行修复。 程序有两种窗口样式。正常模式即默认样式,适合绝大多数用户使用。另有一种简约模式,此时窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。 程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。同时,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行写一个需要修复文件的序号即可。该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式时无效)。 本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问题时,及时分析和查找原因,以便找到解决办法。 程序的“选项”对话框中包含了4项高级功能。点击其中的“注册系统文件夹中所有dll文件”按钮可以自动注册系统文件夹下的所有dll文件。该项功能不仅能修复DirectX的问题,还可以修复系统中很多其他由于dll未注册而产生的问题,颇为实用。点击该按钮旁边的小箭头,还可以注册任意指定文件夹下的dll文件,方便用户对绿色版、硬盘版的程序组件进行注册。点击第二个按钮可以为dll文件的右键菜单添加“注册”和“卸载”项,方便对单独的dll文件进行注册。请注意,并不是所有的dll文件都可以通过这种方式注册。点击“DirectX版本”选项卡可以自行修改系统中DirectX的版本信息。点击“DirectX加速”选项卡可以控制系统中DirectX加速的开启与关闭。 新版程序集成了用户反馈程序,可以在用户允许的前提下发送检测修复结果。用户也可以在出现问题时通过反馈程序和软件作者进行交流,共同查找问题。反馈是完全自愿和匿名(如果不填写E-mail地址)的。 本程序的通用版基于Microsoft .NET Framework 2.0开发,对于Windows 2000、Windows XP、Windows 2003的用户需要首先安装.NET Framework 2.0或更高版本方可运行本程序。有关下载和安装的详细信息请参阅“致Windows XP用户.txt”文件。对于Windows Vista、Windows 7及后续用户,可以直接运行本程序。 同时鉴于Windows 8(Windows 8.1、Windows 8.1 Update)、Windows 10系统中默认未包含.NET Framework 2.0,因此新版的程序文件夹内将包含一个DirectX_Repair_win8的特别版程序,该程序功能与通用版相同,基于.NET Framework 4.0开发,可以在Windows8(Windows 8.1、Windows 8.1 Update)、Windows 10系统中直接运行(其他系统如果安装了.NET Framework 4.0也可以运行这个特别版的程序)。 本程序的官方博客地址为:http://blog.csdn.net/vbcom/article/details/6962388 所有的更新以及技术支持都可以到该博客上找到。

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧