(计算机应用技术专业论文)基于nucleus的闪存文件系统研究和改进.pdf_第1页
(计算机应用技术专业论文)基于nucleus的闪存文件系统研究和改进.pdf_第2页
(计算机应用技术专业论文)基于nucleus的闪存文件系统研究和改进.pdf_第3页
(计算机应用技术专业论文)基于nucleus的闪存文件系统研究和改进.pdf_第4页
(计算机应用技术专业论文)基于nucleus的闪存文件系统研究和改进.pdf_第5页
已阅读5页,还剩51页未读 继续免费阅读

(计算机应用技术专业论文)基于nucleus的闪存文件系统研究和改进.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

i 摘摘 要要 nucleus plus 是一种实时、多任务、易移植的嵌入式操作系统,它基于 flash 的文 件系统分成两个层次,fat 层和 fmm 层。此文件系统有着结构简单,移植性好等优 点,但是在实际使用过程中,也存在一些问题,主要表现为自我修复能力差,掉电容 易损坏,文件系统的可靠性不高;脏扇区回收效率低,影响整个系统的可用性。因此, 有必要在对整个文件系统进行详细分析的基础上对其进行相应的改进。 针对 nucleus plus 文件系统存在的问题,从两个方面进行改进,一是文件系统的 可靠性,二是文件系统的实时性。 首先,通过对 fat 表及文件系统 fat 层工作机制的分析,找出了文件系统掉电 容易损坏的原因,总结出四种具体体现:簇链循环、簇链交叉引用、实际文件大小与 目录项不一致、簇链丢失,并一一进行改进。具体做法是:在不改变整个 fat 层源代 码总体结构的基础上增加磁盘检查功能,使得文件系统能够在出现错误之后自动修 复。改进之后,文件系统的代码仍然保持独立性,从而在提高文件系统可靠性的同时 保证了可移植性。 其次,通过对文件系统 fmm 层中 flash 的写操作、擦除操作以及脏扇区回收算 法的分析,找出了脏扇区回收效率低下的根本原因:原有的脏扇区回收算法不加选择 地处理每一个擦除块。因此,提出并实现了有选择回收算法,打破了原来必须顺序选 择擦除块的定式,采用新的回收机制后,大大地提高了文件系统的实时性。同时,提 高实时性还保证了在异常掉电后,绝大部分的写操作能够在终端电容放电完毕之前完 成,从而大大降低了由于异常掉电而导致文件系统损坏的概率,这又间接地提高了文 件系统的可靠性。 关键字:关键字:嵌入式系统,文件系统,闪存,可靠性,实时性 ii abstract nucleus plus is a real-time,multi-task and easy-porting embedded operating system,whose flash-based file system is divided into two layers-fat and fmm.this file system has the advantages of simpleness and easy-porting capability,but it also has some problems while being used.one problem is its week self-repair ability,and the file system breaks down easily when power fails,so the reliability of the file system isnt good enough;the other is that the dirty-sectors-checking procedure takes too much time,which affect the capability of the whole file system.so,its necessary for us to analyse the whole file system fully and improve it suitably. aiming at the problems of the file system of nucleus plus,we advance it in two views,one is the reliability,the other is the real-timing. first,we find the cause of breaking down easily when power fails by analysing the fat table and the mechanism of fat layer.we conclude four performances:cluster-chain cycles,cluster-chain is cited across,the actual file size is different from the value in directory entry and cluster-chain is lost,and improve them one by one.the idiographic work is that we add the function of disk-scanning without changing the whole structure of the source of fat layer,so the file system can repair itself when error occurs.after the improvement,the source of the file system maintain its independence,so we guarantee its easy-porting capability when improving the reliability. secondly, we conclude the cause of low efficiency of reclaim dirty sectors by analysing the writing process,erasing process and the algorithm of reclaiming dirty sectors.the cause is that the original algorithm deals with every block one by one.so,we advance and implement choosing algorithm,breaking the regular that the block must be disposed orderly.after the improvement,the real-timing of the file system enhance obviously.the improvement of real-timing still guarantees that most of the writing processes can finish before the capacitance discharges completely,so the probability of breaking down when power fails decreases,which improve the reliability of the file system indirectly. key words: embedded system, file system,flash, reliability, real-timing 独创性声明 独创性声明 本人声明所呈交的学位论文是我个人在导师指导下进行的研究工作及取得的研 究成果。尽我所知,除文中已经标明引用的内容外,本论文不包含任何其他个人或集 体已经发表或撰写过的研究成果。对本文的研究做出贡献的个人和集体,均已在文中 以明确方式标明。本人完全意识到,本声明的法律结果由本人承担。 学位论文作者签名: 日期: 年 月 日 学位论文版权使用授权书 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,即:学校有权保 留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本 人授权华中科技大学可以将本学位论文的全部或部分内容编入有关数据库进行检索, 可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 保密 ,在_年解密后适用本授权书。 不保密。 (请在以上方框内打“” ) 学位论文作者签名: 指导教师签名: 日期: 年 月 日 日期: 年 月 日 本论文属于 1 1 绪论绪论 1.1 课题背景课题背景 嵌入式系统1与我们的生活休戚相关, 类似 mp3 播放器2、 个人数字助理 pda3、 车载全球定位系统 gps4等都不断地改变着我们的生活。 随着嵌入式系统的不断发展, 出现了不少优秀的嵌入式操作系统5,如 wince6,ucos7,vxworks8,9,nucleus plus10,uclinux11等等,这些操作系统各有特色,在嵌入式领域中都得到了广泛的 应用。 近年来嵌入式系统的存储和检索的数据量越来越大, 嵌入式文件系统12越来越受 到重视。作为操作系统的一个重要组成部分,文件系统13需要给上层提供可靠的、高 效的服务。对于嵌入式系统来说,由于终端设备经常工作在恶劣的环境下,所以嵌入 式文件系统在可靠性方面要做得比 pc 机14的文件系统更好。另外,嵌入式系统一般 还要求具备比较高的实时性,因此实时性也是嵌入式文件系统的一个重要指标。 嵌入式文件系统的存储介质通常是 flash15,16。flash 存储器作为一种安全、快速 的存储体,具有体积小、容量大、成本低、掉电数据不丢失等一系列优点。目前已经 逐步取代其它半导体存储元件,成为嵌入式系统中主要数据和程序载体。由于 flash 设备本身的特点,使得基于 flash 的文件系统的操作和管理方式要采用不同于一般存 储设备的机制。 本课题的目的就是在对 nucleus plus 基于 flash 的文件系统进行研究、分析的基 础上,对文件系统进行改进和优化,提高文件系统的可靠性和实时性,进而提高整个 嵌入式系统的性能,给最终用户提供更好的服务。 1.2 国内外概况国内外概况 1.2.1 flash 文件系统关键技术文件系统关键技术 闪速存储器是一类非易失性存储器 nvm17(non-volatile memory) ,它既具有同 eprom18一样的可编程能力,又具有 e2prom19的电可擦除性能。闪速存储器擦写 时只需 5v 的工作电压,加上接口电路简单,因此自它问世以来很快在各种嵌入式系 统中得到应用。嵌入式系统中使用的 flash 主要分为 nor 和 nand20两种类型,由 2 于本课题研究的是 nor flash,所以这里我们以 nor flash 为例介绍 flash 的特点。 1nor flash 的读操作与普通的静态随机存取存储器 sram 类似,可以实现完 全随机的字节读取,也正因为这样,使得 nor flash 非常适合用在代码存储方面,因 为代码需要在芯片里直接执行(execution in place21)。 2nor flash 的写操作较为特殊,像我们的磁盘22,当要修改某个文件时,只 要读出内容,修改后写回原位置即可,而 nor flash 并不是这样,在修改完成后不是 写回原位置,而是找一个新的干净区域写入,并把原来的数据空间置为不可用,这样 最终会导致整个 flash 都不可用, 此时再要对 flash 某个存储单元进行写操作, 就需要 经过一个“擦除写入”的过程。先对这个存储单元所在的块(block)执行擦除操作, 擦除操作完成后,整个块的内容被清空(通常被设置为全 1) ,即对不可用的空间进行 回收,然后对目的单元执行写入操作。 3从上面的写操作可以看出,nor flash 在进行文件操作的过程中,擦除是不可 避免的,然而它的擦除次数却是有限的,通常为 10 万次的数量级,所以 nor flash 在使用中经常会出现坏块。 一般来说,在嵌入式系统中应用闪速存储器的最佳方案是在 flash 上构建一个文 件系统, 对 flash 存储器中的数据进行有效的存储管理, 同时对 flash 本身的坏损单元 提供有效的坏损管理机制23,24。基于上述 flash 芯片特性和嵌入式系统工作环境两方 面的考虑,在嵌入式平台上构建基于 flash 的文件系统必须实现以下关键技术: 1崩溃恢复25(crash-recovery) :嵌入式系统的运行环境一般比较恶劣,这就对 flash 文件系统的可靠性提出了严格的要求:无论程序崩溃或系统掉电,都应保持文 件系统的一致性和完整性。文件系统的写入、垃圾回收操作对系统掉电等异常中断都 非常敏感,极易造成数据丢失和数据垃圾,因此在文件系统设计和选用时必须考虑掉 电保护机制。 2损耗均衡(wear-leveling) :闪速存储器不能无限次重复使用。它的每个擦除 单元的擦除次数虽然很大,但却有限;因此,随着使用次数的加长,它最终会变成只 读状态。为了尽最大可能延长整个 flash 的寿命,行之有效的方法是平衡使用所有的 存储单元,而不让某一单元过度使用。这种技术被称之为损耗均衡。 3垃圾回收26(garbage collection) :由于 flash 的写操作总是在新的空闲区域中 进行,同时把原来的区域置为脏,所以 flash 在使用一段时间后,会出现大量的脏扇 区,当脏扇区数量多到写操作不能正常进行时,就需要进行垃圾回收操作,以保证存 3 储空间中的空闲区域足够进行一次写操作。 4坏块管理:虽然我们实现了损耗均衡,但是随着擦除次数的增加,坏块的出 现是不可避免的,所以我们要对已经损坏的擦除块加以管理,以避免对这些坏块的写 操作。 1.2.2 flash 文件系统发展概况文件系统发展概况 总体上,flash 文件系统可以分为两大类,一类就是使用目前已经成熟的磁盘文 件系统,比如 linux 27用的 ext228、ext329,windows30用的 ntfs31或者 fat3232。 目前广泛使用的磁盘文件系统有如下几种: 1fat 文件系统: 常见的 fat 文件系统有两种,fat1633和 fat32 分区格式。fta16 在 dos 时代 得到广泛的应用,现在一般不常见了。fat32 是 fat16 的升级版本,这种格式采用 32 位的文件分配表,对磁盘的管理能力大大增强,突破了 fat16 对每一个分区的容 量只有 2gb 的限制。运用 fat32 的分区格式后,用户可以将一个大硬盘定义成一个 分区,而不必分为几个分区使用,大大方便了对硬盘的管理工作。而且,fat32 还具 有一个最大的优点: 在一个不超过 8gb 的分区中, fat32 分区格式的每个簇容量都固 定为 4kb,与 fat16 相比,可以大大地减少硬盘空间的浪费,提高了硬盘利用效率。 虽然在安全性和稳定性上比不上 ntfs 格式, 但它有个最大的优点, 那就是兼容性好, 几乎所有的操作系统都识别该格式, 包括dos6.0、 win9x、 winnt、 win2000和winxp。 2ntfs 文件系统 ntfs 分区格式是跟随 windows nt 系统产生的,它显著的优点是安全性和稳定 性极其出色,在使用中不易产生文件碎片,对硬盘的空间利用及软件的运行速度都有 好处。它能对用户的操作进行记录,通过对用户权限进行非常严格的限制,使每个用 户只能按照系统赋予的权限进行操作,充分保护了网络系统与数据的安全。除了 windows nt 外,win 2000 和 win xp 也都支持这种硬盘分区格式。但因为 dos 和 win98 是在 ntfs 格式之前推出的,所以并不能识别 ntfs 格式。 3ext 文件系统。 ext 文件系统主要在 linux 下使用,到目前为止有 ext2 和 ext3 两个版本。 ext2: 是 gnu/linux 系统中标准的文件系统,其特点为存取文件的性能极好, 对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。其单一文件 4 大小与文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的 x86 电脑系统中,簇最大为 4kb, 则单一文件大小上限为 2048gb, 而文件系统的容量上 限为 16384gb。但由于目前核心 2.4 所能使用的单一分割区最大只有 2048gb,因 此实际上能使用的文件系统容量最多也只有 2048gb。 ext3: 顾名思义,它就是 ext2 的下一代,也就是在保持目前 ext2 的格式之下再 加上日志功能。 目前它离实用阶段还有一段距离, 也许在下一版的核心就可以上路了。 ext3 是一种日志式文件系统。日志式文件系统的优越性在于:由于文件系统都有快取 层参与运作,如不使用时必须将文件系统卸下,以便将快取层的资料写回磁盘中。因 此每当系统要关机时,必须将其所有的文件系统全部卸下后才能进行关机。 但是这些基于块设备的文件系统并不适用于嵌入式系统中的数据存储。第一,嵌 入式系统电源供给不稳定和突发性断电都可能造成灾难性的影响,而通用文件系统在 这一点上考虑不足;第二,通用文件系统大量使用缓存技术来提高文件系统的速度特 性,通常要耗费比较多的系统资源,这有悖于嵌入式系统有限的资源环境28;第三, 常见的 flash 限制了块擦除次数,再加上它三倍于 sram(静态只读存储器)的价格, 这就需要一种特殊的支持压缩的文件系统。 第二类 flash 文件系统就是专门针对 flash 的特点而建立的,主要有以下几种: 1trueffs(true flash filesystem) trueffs 本身并不是一个文件系统, 需要在 trueffs 之上加载 dos 文件系统才能 使用,否则毫无意义。trueffs 屏蔽了下层存储介质的差异,为开发者提供了统一的 接口方式。trueffs 由 1 个核心层和 3 个功能层组成:编译层、mtd 层(memory technoilogy driver) 、socket 层。 翻译层主要实现 trueffs 和 dos 文件系统之间的高级交互功能,管理文件系统 和 flash 中各物理可擦块的关系,以及 trueffs 中各种智能化处理功能,例如块映射、 损耗均衡(wear-leveling)等。目前有三种不同的翻译层模块可供选择。选择哪一种 模块要根据使用的 flash 介质采用 nor 技术、还是 nand 技术,或者 ssfdc 技术而 定。 mtd 层实现对具体的 flash 进行读、写、擦、id 识别、映射等驱动,并设置与 flash 密码相关的一些参数。 socket 层提供了 trueffs 和硬件之间的接口服务, 负责电源管理、 检测设备插拔、 硬件写保护、窗口管理和向系统注册 socket 等。 5 核心层将其它三层有机结合起来,处理全局问题,例如信息量、计时器、碎片回 收和其它系统资源等。 2日志闪存文件系统 日志式文件系统34-36的基本设计思想是跟踪文件系统的变化。根据实现技术的不 同,写入日志区域的信息是不一样的,某些实现技术仅仅写入文件系统的元数据 meta-data,而有些则会记录所有的写操作到日志中。这样,如果崩溃发生在日志内容 被写入之前,那么原始数据仍然在存储介质上,丢失的仅仅是最新的更新内容。如果 崩溃发生在真正的写操作时(也就是日志内容更新以后) ,日志文件系统的日志内容 则会显示进行哪些操作,因此系统重启时,它能很容易地根据日志内容快速恢复被破 坏的更新。 目前有很多项目都使用了日志技术来开发新的文件系统以取代广泛使用的线性 文件系统。常见的 linux 环境下的日志式闪存文件系统主要有 jffs37和 jffs238,后 者对前者进行了功能扩充,将会成为嵌入式闪存文件系统的最佳选择。 jffs2 文件系统建立在 jffs 的设计基础上,扩充了数据压缩、垃圾回收、自适 应耗损平衡等功能。目前 jffs2 已获得 gnu39通用公共许可证(gpl)以及瑞士 mpl 公司的“red hat ecos40共有版权” ,以便与 ecos 源码的版权相一致。尽管 jffs2 考 虑到了系统的可移植性,但由于未实现接口,所以 jffs2 目前还仅支持 linux 2.4。 3fmm 文件系统(flash media manager) fmm(flash media manager)是由 tri 公司开发的专门针对 nor 型 flash 的管 理软件,其主要特点如下: 1)动态映射 os 的逻辑扇区到物理地址; 2)所有物理块进行寿命均衡,同时可记录 flash 的擦写次数; 3)掉电数据恢复,可以保证系统的稳定性; 4)创建坏块表进行坏块管理,保证系统的可靠性。 4yaffs41文件系统(yet another flash file system) yaffs 类似于 jffs/jffs2,是专门为 nand 闪存设计的嵌入式文件系统,适用 于大容量的存储设备。它是日志结构的文件系统,提供了损耗平衡和掉电保护,可以 有效地避免意外掉电对文件系统一致性和完整性的影响。 yaffs 文件系统是按层次结 构设计的,分为文件系统管理层接口、yaffs 内部实现层和 nand 接口层,这样就 简化了其与系统的接口设计,可以方便地集成到系统中去。与 jffs 相比,它减少了 6 一些功能,因此速度更快,占用内存更少。 yaffs 充分考虑了 nand 闪存的特点,根据 nand 闪存以页面为单位存取的特 点,将文件组织成固定大小的数据段。利用 nand 闪存提供的每个页面 16 字节的备 用空间来存放 ecc42 (error correction code)和文件系统的组织信息, 不仅能够实现错 误检测和坏块处理,也能够提高文件系统的加载速度。 yaffs 采用一种多策略混合的 垃圾回收算法,结合了贪心策略的高效性和随机选择的平均性,达到了兼顾损耗平均 和系统开销的目的。 1.3 主要研究工作主要研究工作 目前在基于 nor flash 的各种文件系统中, fmm 文件系统与 fat 文件系统协作 的方案有着使用方便、在不同平台上易移植等优点。nucleus plus 就使用这种方案, 但是在嵌入式产品的实际应用中,这种搭配方案也存在一些问题,首先是文件系统在 掉电时很容易损坏, 文件系统的可靠性不高。 其次, 文件系统的脏扇区整理效率低下、 整理时间过长,影响了文件系统的实时性能。其中第一个问题在武汉精伦电子股份有 限公司的公用信息终端产品 pbi 经常发生,据统计,一个月内因文件系统崩溃而报修 的终端达到总数的 10%,这大大增加了维修成本。 针对上述问题,本课题拟基于 nucleus plus 对 flash 文件系统进行深入地分析, 找出上述问题的根源,并在此基础上对文件系统进行改造,以提高它的可靠性和实时 性。课题主要工作如下: 1深入分析基于 nucleus plus 的 flash 文件系统,根据文件系统的结构,分成两 个层次来进行,重点分析 fat 层的工作机制,fmm 层的掉电恢复机制及脏扇区回收 机制,从中找出影响文件系统可靠性和实时性的根源。 2在分析的基础上,针对文件系统在异常掉电情况下容易崩溃的问题,大量分 析损坏文件系统的 fat 表,找出问题的根源。并在此基础上对文件系统的 fat 层进 行改造,以提高整个文件系统的可靠性。 3根据对 fmm 文件系统层写操作及擦除操作的分析和研究,针对 fmm 层脏扇 区回收效率不高的问题,提出并实现脏扇区回收算法的改进方案,以提高整个文件系 统的实时性。 7 2 nucleus plus 文件系统分析文件系统分析 本章介绍 nucleus plus 文件系统的整体结构,在此基础上重点分析 nucleus plus 文件系统中 fat 层和 fmm 层的工作机制。 2.1 整体结构整体结构 nucleus plus 按照功能的抽象层次,把文件系统分为两层来管理,分别为 fat 层 和 fmm 层。nucleus plus 文件系统的体系结构如图 2.1 所示。 nor flash fmm层 (flash读写和擦除、脏扇区回收、掉电恢复、坏块管理) fat层 (簇链管理、并发控制、缓冲区管理) 应用层 图 2.1 nucleus plus 文件系统的整体架构 fat 层内部实现了 fat 文件系统的所有特性和功能,包括簇链管理、缓冲管理和 文件的并发控制等高级管理功能,并将这些功能封装成接口。用户在实际的编程过程 中,不需要了解 fat 层的实现细节,只要调用 nucleus plus 提供的文件操作接口就可 以很容易地实现用户想要的功能。 fmm 层实现了底层的 nor flash 设备的具体管理。该层对上层的 fat 文件系统 8 层提供基本的扇区读写接口,fat 层不用关心 fmm 层的实现细节,在进行文件操作 时只需要给出逻辑扇区号就可以了。而逻辑到物理的转换以及磨损平衡、坏块管理等 都由 fmm 层来完成,文件系统的这两个层次相互协作,为用户实现文件操作提供统 一的接口。 2.2 fat 层工作机制层工作机制 2.2.1 结构简介 结构简介 fat 的含义是 file allocation table,它是在微软 dos/windows 操作系统中广泛 使用的一种文件系统格式,它有三个版本:fat12、fat16、fat32。本研究使用的是 fat16 格式,同时由于终端的存储介质是 nor flash,所以没有磁盘中的 fat16 文件 系统那些复杂的结构, 而是把整个 flash 看成一个分区, 这样就少了主引导扇区(mbr) 的部分及多个分区信息的部分,使得整个系统实现更简单、实用。 一个典型的 fat16 分区结构可以分为:dbr 区、fat 表区(包括 fat1 和 fat2)、 根目录区、数据区和剩余扇区。如图 2.2 所示。 dbr 区 fat1 fat2(fat 1的备份) 根 目 录 数据区 剩 余 扇 区 图 2.2 fat16 文件系统的结构 下面就每个部分进行介绍: 1dbr 区(dos boot record) dbr 区是操作系统引导记录区的意思, 通常占用分区的第 0 扇区共 512 个字节。 在这 512 个字节中,又由跳转指令,厂商标志和操作系统版本号, bpb(bios parameter block),扩展 bpb,os 引导程序,结束标志几部分组成。其中最重要的就是 bpb 段,它记录了分区的一些基本信息,比如每扇区的字节数、每簇的扇区数、fat 表的数目及每张 fat 表所占的扇区数等等。 2fat 表区 fat 表, 是 microsoft 在 fat 文件系统中用于磁盘数据(文件)索引和定位引进的一 种链式结构。在 fat 文件系统中,文件的存储依照 fat 表制定的簇链式数据结构来 9 进行。同时,fat 文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的 管理。 fat 表实际上是一个数据表,以 2 个字节为单位,我们将这个单位称为 fat 记录 项,通常情况其第 1、2 个记录项(前 4 个字节)用作介质描述。从第三个记录项开始记 录除根目录外的其他文件及文件夹的簇链情况。 根据簇的表现情况 fat 表用相应的取 值来描述,如表 2.1 所示。 表 2.1 fat16 记录项的取值含义 fat16 记录项值 对应簇的表现情况 0 x0000 未分配的簇 0 x00020 xffef 已分配的簇 0 xfff00 xfff6 系统保留 0 xfff7 坏簇 0 xfff80 xffff 文件结束簇 fat16 文件系统从根目录区之后的第一个扇区开始以簇为单位进行数据的处理, 这之前仍以扇区为单位。通常情况下,每扇区 512 字节的原则是不变的。簇的大小一 般是 2n (n 为整数)个扇区的大小,像 512b,1k,2k,4k,8k,16k,32k。对于根目录之后的 第一个簇,系统并不编号为第 0 簇或第 1 簇,而是编号为第 2 簇,也就是说数据区顺 序上的第 1 个簇也是编号上的第 2 簇。所以你在表 2.1 中看到“已分配的簇”部分是 从 0 x0002 开始。 在读取文件时,首先根据完整路径在根目录区找到文件的首簇号,再根据这个簇 号找到 fat 表中的相应位置,而这个位置中存放的就是下一个簇号,如此顺序遍历, 直到文件结束簇为止,这样就可以完整的读出一个文件了。 由于 fat 表对 fat 文件系统来说十分重要,所以在设计文件系统的时候为 fat 表建立了一个副本,即我们看到的 fat2 部分。fat2 与 fat1 (即上述的 fat 表)的内 容通常是即时同步的, 也就是说如果通过正常的系统读写对fat1做了更改, 那么fat2 也同样被更新。 3根目录 fat 文件系统的目录结构其实是一颗有向的从根到叶的树,这里提到的有向是指 对于 fat 分区内的任一文件(包括文件夹), 均需从根目录寻址来找到。 可以这样认为: 10 目录存储结构的入口就是根目录。 fat 文件系统根据根目录来寻址其他文件(包括文件夹),故而根目录的位置必须 在磁盘存取数据之前得以确定。fat 文件系统就是根据分区的相关 dbr 参数与 dbr 中存放的已经计算好的 fat 表(2 份)的大小来确定的。格式化以后,根目录的大小和 位置其实都已经确定下来了:位置紧随 fat2 之后,大小通常为 32 个扇区。 fat文件系统的一个重要思想是把目录当前一个特殊的文件来处理, 在fat16中, 虽然根目录地位并不等同于普通目录,但其组织形式和普通的目录并没有不同。fat 分区中所有的目录文件,实际上可以看作是一个存放其他文件(或目录)入口参数的数 据表。所以目录的占用空间大小并不等同于其下所有数据的大小,但也不等同于 0. 通常是占很小的空间,可以把目录文件看作是一个简单的二维表文件。其具体存储原 理是: 不管目录文件所占空间为多少簇,一簇为多少字节。系统都会以 32 个字节为单 位进行目录文件所占簇的分配。这 32 个字节以确定的偏移来定义本目录下的一个文 件(或目录)的属性。这 32 个字节的各字节偏移定义如表 2.2 所示。 表 2.2 fat16 目录项 32 个字节的定义 字节偏移(16 进制) 字节数 含义 0 x00 x7 8 文件名 0 x80 xa 3 扩展名 00000000(读写) 00000001(只读) 00000010(隐藏) 00000100(系统) 00001000(卷标) 00010000(子目录) 0 xb 1 属 性 字 节 00100000(归档) 0 xc0 x15 10 系统保留 0 x160 x17 2 文件的最近修改时间 0 x180 x19 2 文件的最近修改日期 0 x1a0 x1b 2 文件的首簇号 0 x1c0 x1f 4 文件的长度 11 4剩余扇区 分区上最后不足一个簇的空间为剩余扇区。 2.2.2 主要数据结构 主要数据结构 在了解了 fat 文件系统一个分区的总体结构之后,我们进一步分析它在 nucleus plus 中的具体实现,fat 文件系统层在打开任何一个文件或目录进行操作时都涉及到 一个数据结构,每一个文件或目录都有一个此数据结构的实例与其相对应,这个结构 体的定义如图 2.3 所示。 图 2.3 fat 层主要数据结构 由上面的结构可以看出, 每一个打开的文件或目录都包含了分区的dbr区的内容, 这部分内容在整个文件系统初始化时写入根目录的 pdrive 中,接下来打开一个目录 或文件时都从相应的父目录继承,一般说来,pdrive 部分的内容在文件系统运行过程 中不会改变。finode 字段用来描述一个文件或目录,比如文件属性、大小、建立日期 等等。blkinfo 字段用来描述目录信息,包括目录的第一个扇区、当前扇区、最后一 个扇区等。isroot 字段用来表示一个目录是否为根目录。pblkbuff 字段表示扇区内 容的链表,包括扇区号,512 字节的缓冲区等,在读写时用来存放扇区的数据。linfo 字段用来处理长文件名。 2.2.3 读写过程分析 读写过程分析 作为逻辑层的 fat 文件系统,与我们熟悉的 c 语言库函数的读写过程十分类似, 在对文件进行读写操作之前,先要打开这个文件。 nucleus plus 操作系统提供了一个名为 nu_open(其中 nu_前缀表示是 nucleus plus 的系统接口)的接口完成打开文件的功能, 此接口根据用户指定的文件名, 访问标 typedef struct drobj ddrive *pdrive; /* block 0 image from the disk */ finode *finode; /* dos entry */ dirblk blkinfo; /* directory information */ int isroot; /* true if this is the root */ blkbuff *pblkbuff; /* block buffer pointer */ lnaminfo linfo; /* for long file name */ drobj; 12 志,比如以只读、文本方式打开文件。函数先检查参数的合法性,然后为用户要打开 的文件分配一个文件描述符。接下来的工作就是根据用户指定的文件名得到文件所在 目录的相关信息,也就是目录对应的 drobj 结构体的实例,目录的相关信息是在文件 系统初始化时根据根目录的信息一级一级生成的,所以在这里目录信息可以被直接使 用。最后在目录下寻找文件并建立与之对应的 drobj 结构体的实例来保存文件的相关 信息,到这里,整个打开文件的操作就已经全部完成了。 在打开文件之后,我们分析 nucleus plus 提供的读操作接口:nu_read,此接口 根据打开文件时得到的文件描述符,得到文件的相关信息,这里最重要的就是文件的 首簇号,以首簇号为起点,根据 fat 表中的簇链依次读取每一簇,直到遇到簇结束标 志为止,这样就读出整个文件的内容。而对于每一簇的读取,是根据簇号得到逻辑扇 区号,然后调用 fmm 层提供的扇区读接口最终完成数据的读取的。 最后,我们分析一下 fat 层的写操作。第一步工作就是检查参数的合法性,然后 同读操作一样,写操作也是根据打开文件时的文件描述符,得到文件对应的 drobj 结 构体的实例。如果新的文件大小比原来大,则要为文件分配新的簇,否则只要在原来 的簇上进行修改。如果簇链关系发生了改变,还要修改 fat 表中相应的信息,以保持 文件的一致性。写操作的具体实现也是通过调用 fmm 层提供的写 flash 函数完成的。 2.3 fmm 层工作机制层工作机制 2.3.1 块和扇区的划分块和扇区的划分 由于 fat 文件系统必须在磁盘类存储介质上使用,而我们的 nor flash 是按字 节访问的,为了能够使用上述的 fat 文件系统,需要把 nor flash 封装成磁盘的形式。 因此, nucleus plus 的 fmm 文件系统层对 flash 芯片进行块和扇区的划分。块是擦除 操作的基本单位,而扇区是写操作的基本单位。图 2.4 描述了一个 flash 物理分区 的结构图。 13 block 1.block n.block n sector 2.sector m.sector m-1 512b的数据4b的标志 sector 1sector m 图 2.4 fmm 中块和扇区的划分 1块的结构 块的大小可以在程序中指定,但是每个块的最后四个字节用于标志该块的状态, 这四个字节不属于该块中的任何一个扇区,一个擦除块的逻辑结构如图 2.5。 数据区4b的标志位 图 2.5 擦除块的结构图 块的擦除状态有三种情况: (1)标志位为 0 xffffffff 时表明该块不是下一个擦除块。 (2)标志位为 0 x00000080(fmm_next_ers_blk)时表示该块是下一次整理磁 盘时开始擦除的块。 (3)标志位为 0 x000000c0(fmm_prevblk_in_ers)时,表示当前该块的前一 个相邻块正在执行擦除操作,设置此标志是为了保证块擦除操作的一致性。 2扇区的结构 扇区在结构上包括数据区和标记区两个部分,数据区的大小基本上等于硬盘、cf 卡等块设备扇区的大小,nucleus plus 文件系统 fmm 层扇区的数据区的大小为 512 字节。标志区位于每一个扇区的头部,大小为 4 个字节,它包括了扇区的状态和逻辑 扇区号。把这 4 个字节转换成一个 4 字节的无符号整数后,最高的一个字节表示扇区 14 的状态,后三个字节为该物理扇区的逻辑扇区号。图 2.6 描述了一个扇区的结构。 512b的数据1b的标志位 3b的逻辑扇 区号 图 2.6 扇区的结构图 扇区的标志位的含义如下: (1) 为 fmm_sector_free 即 0 xf0 时, 表示该扇区是空闲扇区, 可以向扇区写 数据。 (2) 为 fmm_sector_dvalid 即 0 xe0 时, 表示该扇区正处于擦写的交换状态。 (3) 为 fmm_sector_inuse 即 0 xc0 时,表示该扇区目前正在被使用。 (4) 为 fmm_sector_dirty 即 0 x80 时,表示该扇区是脏扇区,扇区上的数据 无效。 (5) 为 0 xff 时,表示该扇区为自由扇区,它是被擦除后的状态。 每个物理扇区的 24 字节表示该物理扇区的逻辑扇区号,因此文件系统 fmm 层 目前最大支持的扇区数为 0 xffffff, 以每个扇区占 512 字节计算, 则最大支持 8g 的 文件系统。 3逻辑扇区和物理扇区 nucleus plus 文件系统在 fmm 层中引入了逻辑扇区和物理扇区的概念, 目的是为 了防止将数据写入扇区时造成原有数据丢失。譬如,当逻辑文件系统调用写函数向 flash 上的某个扇区写入数据时,如果该扇区上已有数据,这样新数据写入后,原有 的数据就会丢失,造成下次访问该扇区的原有数据信息的失败。因此的 fmm 层在原 有的物理扇区基础上又引入了逻辑扇区概念。 所谓逻辑扇区是一个抽象的虚拟扇区,fmm 层通过逻辑扇区管理底层的存储设 备,如使用读写接口访问逻辑扇区。在逻辑扇区和物理扇区间建立一一对应的关系, 使 fmm 能够通过逻辑扇区最终访问到真正的物理扇区。这样当向某个已存在有数据 的物理扇区写入数据时,就不必用新数据信息覆盖原有扇区数据,而是把新数据写入 其他空闲的扇区中,同时更新逻辑物理扇区对应关系,并将原扇区标志改为脏扇区, 从而既完成了新数据的写入,又保证了原有扇区中的数据信息不丢失。 15 从以上对逻辑扇区和物理扇区的概念介绍中可以看出,在二者间起到桥梁作用的 是逻辑扇区和物理扇区的映射关系,这种映射关系通过逻辑物理扇区映射表来实现。 nucleusplus 在 fmm 层初始化时, 首先根据所有物理扇区的数目分配逻辑物理扇区映 射表的空间;然后扫描所有扇区,分析每个扇区的标志区,从中得到该物理扇区对应 的逻辑扇区号(逻辑扇区号在 flash 存储设备格式化时生成) ;这样在顺序扫描过程中 将每个物理扇区的物理扇区号及其逻辑扇区号填充进映射表中。 简而言之,物理扇区的 24 个字节存放的是其对应的逻辑扇区号,逻辑扇区到物 理扇区的映射表中存放的是对应的物理扇区号,通过这样的方式完成了逻辑扇区和物 理扇区一对一的映射关系。这样 fat 层就不用关心物理扇区的细节,对文件的操作只 要给出逻辑扇区号即可。 2.3.2 全局数据结构全局数据结构 有了对 nucleus plus 文件系统 fmm 层整体的了解和对块和扇区的划分,以及逻 辑扇区到物理扇区的转换等这些基本概念的理解,就可以从全局的角度考虑 nucleus plus 文件系统 fmm 层的实现机制。由于 fmm 层本身是一个一体化的文件系统,也 就是说在 fmm 层内部并没有进行抽象分层,所以必须有一个全局性的数据结构对 flash 分区的当前状况进行描述, 这样 fmm 层内部的所有函数和过程都可以访问该数 据结构,了解 flash 分区当前的状况,该数据结构的类型为 flash_info_t。 该数据结构中有关于 flash 分区整体信息的描述的结构,如当前分区的所有扇区 数、脏扇区数、自由扇区数和总的擦写块个数;同时,也包括 fmm 层本身运行所需 要的一些对象和信息,如逻辑物理扇区映射表 、下一个自由扇区号和下一个擦除块 的块号;另外,flash_info_t 也描述了有关 flash 介质的一些特性和操作,如 flash 操作的总线宽度、一个擦除块的大小和 flash 分区在内存地址空间的起始地址等。 其各主要成员的具体含义如图 2.7 所述。 16 图 2.7 fmm 层全局数据结构 2.3.3 读写过程分析读写过程分析 fmm 层读写操作使用的是同一个函数:rwsectors,此函数根据一个参数来区分 当前是要进行读操作还是写操作。 读操作根据上层逻辑层传递的逻辑扇区号找到对应的物理扇区号,再把物理扇区 号转化成物理地址,根据这个地址按字节读取所要读的内容。读操作与普通内容没有 什么区别,只不过这里的读操作都是以扇区为最小粒度,所以需要上述的转换过程。 对于 nor flash 这种存储介质来说,它有一个特点,那就是用过的 flash 空间要 typedef struct flash_info t_uint32 flag; /* flash 状态标志 */ reg_fmm_t dev_char; /* 存放 fmm 的初始注册信息 */ t_uint32 numsect; /* fmm 管理的扇区总数 */ t_uint32 nextsect; /* 下一个自由扇区数(物理扇区号) */ t_uint32 numfreesect; /* 自由扇区数 */ t_uint32 numdirtysect; /*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论