-
2020-05-07 10:39:59
FAT文件系统结构
FATFS是一个简单的文件系统,本质上说它是一个巨大的表-簇的链表。是目前最常使用的文件系统之一。
1、FATFS的分类
FAT文件系统有几个不同的版本。每个版本都针对不同大小的存储介质。
(1)、FAT12
FAT12是为软盘设计的,它最大可以管理16MB的大小,因为它使用12位来寻址簇。
(2)、FAT16
FAT16是为早期硬盘设计的,可以处理最大SIZE为64K个簇*簇SIZE。硬盘越大,簇SIZE就越大,因为簇的个数已经确定了,要增大磁盘只能增大簇的SIZE,这就导致了磁盘上大量的“闲置空间”,即是最后一个簇可能浪费大量空间。
(3)、FAT32
FAT32解决了一些FAT的问题。不再是64K的最大簇数目!FAT32实际上只使用了28位起来操作,因为32位簇的数目的最高4位被保留了,并且从未使用过。实际上你可以叫它FAT28。该文件系统可以处理每个分区最多256M(2^28)的簇数目。这使得非常大的硬盘仍然可以保持相当小的簇大小,从而减少文件之间的闲置空间。
(4)、ExFAT
ExFAT是由Microsoft创建的SDXC卡上使用的文件系统。它基本上是FAT32,实际上每个FAT条目使用32位,有一些扩展。
(5)、VFAT
VFAT是FAT文件系统的扩展,它能够使用长文件名(最多255个字符)。2、实现细节
FAT文件系统将存储媒体视为簇的平面阵列(数组)。存储媒体被组织成三个基本区域
- 引导记录区
- 文件分配表(FAT)
- 目录和数据区域
2.1、引导记录区(Boot Record)
引导记录占用一个扇区,并且总是位于“分区”的逻辑扇区号0中。这是分区上最容易让计算机在加载它时找到的扇区。如果存储媒体是分区的(例如硬盘),那么实际媒体的开头包含MBR (x86)或其他形式的分区信息。在这种情况下,每个分区的第一个扇区保存一个卷引导记录.
2.2、BPB (BIOS 参数块)
引导记录同时包含代码和数据。非代码的数据称为BPB。
2.3、扩展的引导记录(Extended Boot Record)
扩展的引导记录紧跟BPB后面。开头的数据称为EBPB。它包含不同的信息,这取决于这个分区是FAT12、FAT16还是FAT32文件系统。紧随EBPB之后的是实际的引导代码,然后是标准的0xAA55引导签名,以填充512字节的引导扇区。偏移量显示从标准启动记录开始。
(1)、FAT12和FAT16
(2)、FAT32
(3)、FSInfo 机构体 (FAT32 only)
2.4、文件分配表
文件分配表(FAT)是存储在存储媒体上的一个表,它指示磁盘上所有数据在所有簇上的状态和位置。它可以被认为是磁盘的“目录”。簇可以被使用,它也可能被操作系统保留,它可能由于磁盘上的坏扇区而不可用,或者它可能被一个文件使用。文件的簇不必在磁盘上彼此相邻。事实上,它们很可能散布在整个磁盘中。FAT表允许操作系统在获得一个文件中链接的全部簇。
(1)、FAT 12
FAT12使用12位来处理磁盘上的簇。FAT中的每个12位条目都指向磁盘上的文件的下一个簇。给定一个有效簇号,下面是如何提取集簇链中的下一个簇的值代码:unsigned char FAT_table[sector_size]; unsigned int fat_offset = active_cluster + (active_cluster / 2);// multiply by 1.5 unsigned int fat_sector = first_fat_sector + (fat_offset / section_size); unsigned int ent_offset = fat_offset % section_size; //at this point you need to read from sector "fat_sector" on the disk into "FAT_table". unsigned short table_value = *(unsigned short*)&FAT_table[ent_offset]; if(active_cluster & 0x0001) table_value = table_value >> 4; else table_value = table_value & 0x0FFF; //the variable "table_value" now has the information you need about the next cluster in the chain.
如果“table_value”大于或等于(>=)0xFF8(4088),那么在链中就没有更多的簇。这意味着整个文件已被读取。如果“table_value”等于(==)0xFF7,那么这个簇已经被标记为“bad”。“坏的”簇容易出错,应该避免。如果“table_value”不是上述情况之一,那么它就是文件中下一个簇的簇号。
因为FAT12使用的条目大小不能被8位整除,所以在一个小端机器上计算出如何解释FAT可能会有点让人困惑。考虑0x123和0x456这两个连续的条目。在小端端计算机上,第一个条目的第一个字节是底部的两个半字节 (0x23),最高的半字节进入第二个字节的底部半字节 (0x?1)。由于下一项现在是从字节中间开始的,所以只有最低的半字节能填入字节(0x6?),而最高的两个半字节可以填入下一个字节(0x45)。因此,这两个条目看起来是这样的:0x23 0x61 0x45。
(2)、FAT 16
FAT16使用16位来处理磁盘上的簇。因此,从16位文件分配表中提取值要容易得多。具体做法如下:unsigned char FAT_table[sector_size]; unsigned int fat_offset = active_cluster * 2; unsigned int fat_sector = first_fat_sector + (fat_offset / sector_size); unsigned int ent_offset = fat_offset % sector_size; //at this point you need to read from sector "fat_sector" on the disk into "FAT_table". unsigned short table_value = *(unsigned short*)&FAT_table[ent_offset]; //the variable "table_value" now has the information you need about the next cluster in the chain.
如果“table_value”大于或等于(>=)0xFFF8,那么在链中就没有更多的簇了。这意味着整个文件已被读取。如果“table_value”等于(==)0xFFF7,那么这个簇已经被标记为“bad”。“坏的”簇容易出错,应该避免。如果“table_value”不是上述情况之一,那么它就是文件中下一个簇的簇号。 (3)、FAT32 fat32使用28位来处理磁盘上的集群。是的,没错。fat32只使用32位中的28位。最高的4位是保留的。这意味着它们在读取时应该被忽略,而在写入时应该保持不变。除了这个小细节之外,从32位FAT中提取值几乎与对16位FAT进行相同的操作:
unsigned char FAT_table[sector_size]; unsigned int fat_offset = active_cluster * 4; unsigned int fat_sector = first_fat_sector + (fat_offset / sector_size); unsigned int ent_offset = fat_offset % sector_size; //at this point you need to read from sector "fat_sector" on the disk into "FAT_table". //remember to ignore the high 4 bits. unsigned int table_value = *(unsigned int*)&FAT_table[ent_offset] & 0x0FFFFFFF; //the variable "table_value" now has the information you need about the next cluster in the chain.
如果“table_value”大于或等于(>=)0x0FFFFFF8,那么在链中就没有更多的簇了。这意味着整个文件已被读取。如果“table_value”等于(==)0x0FFFFFF7,那么这个簇已经被标记为“bad”。“坏的”簇容易出错,应该避免。如果“table_value”不是上述情况之一,那么它就是文件中下一个簇的簇号。
3、目录
目录项只是存储所需的信息,以了解文件的数据或文件夹的子文件夹在磁盘上的存储位置。它还保存条目的名称、大小和创建时间等信息。FAT文件系统中有两种目录。标准8.3目录项,它出现在所有FAT文件系统中,以及长文件名目录项(可选地出现,以允许更长的文件名)。
3.1、标准的8.3文件格式(目录条目格式)
3.2、长文件名(目录条目格式)
更多相关内容 -
FAT文件系统白皮书.pdf
2019-08-21 09:35:32详细介绍了计算机FAT文件系统(包括FAT32文件系统),对于嵌入式系统的开发和文件系统的理解有着重要参考价值,值得收藏 -
FAT文件系统原理及结构详细讲解.pdf
2019-07-30 23:52:25描述FAT文件系统非常不错的参考资料。详细讲解了FAT文件系统的结构。 -
FAT文件系统的一些总结
2018-10-13 17:29:19FAT 文件系统总结,由罗流毅 编写,介绍了FAT文件系统。 -
FatFs通用FAT文件系统_0.09A中文手册(带书签).pdf
2020-07-05 11:29:18FatFs通用FatFs通用FAT文件系统_0.09A中文手册 详细的函数说明和实例。FAT文件系统_0.09A中文手册 详细的函数说明和实例。 -
FAT文件系统
2017-04-02 22:04:00详细讲解FAT文件系统的组织 FDT(File Directory Table)即文件目录表,由若干个32字节的表项构成,登记着分区上的目录、文件和子目录信息。这些信息包括文件和目录的名称、创建日期、属性、大小、从硬盘何处开始存放... -
FAT文件系统原理及实现.pdf
2020-05-05 14:48:48对FAT宏观描述。 。欢迎下载 -
FatFs通用FAT文件系统
2018-04-04 14:30:24FatFs通用FAT文件系统API函数说明,中文版,通俗易懂,入门必选 -
51单片机上移植的FAT文件系统,可以成功读取FAT32文件系统的SD卡里面的文件.zip
2020-06-13 13:25:4051单片机上移植的FAT文件系统,可以成功读取FAT32文件系统的SD卡里面的文件.zip -
FAT快速版--嵌入式FAT文件系统免费源码下载
2018-01-16 16:18:49FAT快速版--嵌入式FAT文件系统免费源码下载 本代码完全兼容FAT16/FAT32文件系统共计两种格式,支持长文件名, 文件名完全支持中文,中文支持需要UNICODE/GB2312码表(需占用190KB的ROM),只支持英文的可不用码表,... -
硬盘FAT文件系统详解原理
2018-04-28 23:54:26详解FAT12/16/32文件系统在硬盘上的具体实现,对深入理解FAT文件系统及实践非常有用。 -
嵌入式FAT文件系统源码
2018-12-14 18:01:22嵌入式FAT文件系统源码,对于研究文件系统源码有很大帮助 -
FAT文件系统格式详解.pdf
2019-09-18 15:19:03结合FAT白皮书看,会对FAT文件系统有更深入的了解与认识。 -
FAT文件系统 FAT文件系统 FAT文件系统 FAT文件系统
2011-04-06 21:31:49FAT文件系统 FAT文件系统 FAT文件系统 FAT文件系统 -
stm8s208上移植SD卡驱动和FAT文件系统
2018-01-15 11:13:08在stm8S208上移植FAT文件系统,实测OK可用,而且速度还可以 -
--FAT精减版(专业嵌入式应用版本)--嵌入式FAT文件系统免费源码下载--
2018-05-10 14:34:24FAT精减版(专业嵌入式应用版本)--嵌入式FAT文件系统免费源码下载 本代码完全兼容FAT16/FAT32文件系统共计两种格式,支持长文件名, 文件名完全支持中文,中文支持需要UNICODE/GB2312码表(需占用190KB的ROM),只支持... -
基于AVR单片机的SD卡FAT文件系统开发程序
2015-08-07 16:09:07完整的基于AVR单片机的SD卡FAT文件系统的开发程序! -
FAT文件系统解析
2017-06-27 16:37:17FAT文件系统解析 -
FAT文件系统介绍文档和官方协议
2017-11-01 23:28:35FAT文件系统的相关介绍,各字段含义,以及官方网站上的协议说明文档 -
FAT文件系统原理.pdf
2016-04-25 18:53:23工作需要,要接触fat系统,但是自己是小白,网上资源杂乱且很贵,所以自己找了一个感觉很有用的来分享,在此收取一点劳务费,望谅解 -
振南FAT文件系统
2018-04-10 20:13:34这是振南FAT文件系统,用于嵌入式开发,在程序中利用这个文件系统向SD卡写入或者读取数据,可以支持在电脑上以文件的方式查看保存数据,方便处理数据。 -
操作系统课程设计报告-建立基于磁盘存储设备的FAT文件系统_磁盘文件系统
2021-08-31 23:00:20物联网专业 压箱底的课设报告, 建立基于磁盘存储设备的FAT文件系统 ,再借鉴晚上大神们的代码基础上,加入自己的核心代码部分,每一个难懂的部分都加了备注 -
fat32文件系统分析工具
2019-02-13 09:31:28fat32文件系统分析工具,支持u盘,tf卡,硬盘等常用存储介质。 存储稳定性测试工具,文件系统优化工具。 -
FAT文件系统源码
2016-10-07 15:51:29FAT32文件系统最新源码 -
操作系统课程设计报告-建立基于磁盘存储设备的FAT文件系统
2015-06-17 22:54:23物联网专业 压箱底的课设报告, 建立基于磁盘存储设备的FAT文件系统 ,再借鉴晚上大神们的代码基础上,加入自己的核心代码部分,每一个难懂的部分都加了备注,最后希望学弟学妹好好利用,权当资源分享了!... -
FAT文件系统规范
2014-06-02 12:06:07微软公司提供的FAT文件系统规范,做嵌入式开发的可以参考。 -
FAT文件系统简明教程
2018-06-10 21:00:09FAT文件系统简明教程 FAT文件系统简明教程 FAT文件系统是什么? FAT文件系统的格式 文件的存储和删除 文件的存储 新建一个文件时,磁盘中发生了什么? 普通删除一个文件时,磁盘中发生了什么? 怎么安全删除? ...FAT文件系统简明教程
FAT文件系统是什么?
FAT是一个由微软发明的简单的文件系统,Linux系统和Windows系统都支持这种文件系统。
FAT文件系统的格式
一个FAT文件系统分为四个不同的部分。
-
第一部分:保留扇区,第一个保留扇区(0号扇区)是记录磁盘的引导记录,分区信息等。
-
第二部分:文件分配表(File allocation Table, FAT),由两部分组成,FAT1和FAT2,FAT2是FAT1的备份,一般情况下不会用到。一般情况下前两簇(0簇和1簇)是保留簇。
文件分配表里会记录簇的使用信息,以及簇列表。文件分配的最小单位是簇,簇标记大小为连续的4个字节,簇的标记有五种:
空闲簇(作用:说明这个簇是没有被占用的。)
坏簇标记0xF7FFFF(作用:说明这个簇不可用,避免将信息写到坏簇上,使得数据丢失。)
簇占用标记0xFFFFFF0F(其实表示该簇是一个文件的结束。)
下一簇的位置(每个文件可能有好多簇表示,用前一簇记录下一簇的位置,达到对整个文件的记录)- 第三部分:根目录区域,相当于一个目录表,用来记录文件和目录信息的。
- 第四部分:数据区域:实际的文件和目录的存储区域。
文件的存储和删除
很多小伙伴可能会有这种体会,删除一个文件比复制或者下载一个文件要快的多。这是怎么回事呢?
-
这其实是因为如果你普通删除一个文件,它并不会将文件的内容真的删除。
-
同样当你重命名一个文件时,其实它并没有删除原本的目录项,而是新建了一个目录项,指向原来的文件内容。
这几句话话听着可能有点绕,没关系,我们通过一个例子来解释一下:
文件的存储
理解文件的安全删除必须先理解文件的存储。
我们这里还是以FAT文件系统来举例:
新建一个文件时,磁盘中发生了什么?
-
操作系统通过读取1号扇区表中的信息,找到
剩余总簇数
,以及下一个可用簇的编号
。 -
然后在
根目录区域
记录文件信息,比如说文件大小,文件名,创建信息等,并且在其中记录文件的首簇号
,并计算新的剩余总簇数
(=之前的剩余总簇数-此文件占用的总簇数),和下一可用簇编号
。 -
在FAT表中修改这个文件的簇列表。
-
在对应簇进行写数据。
-
操作系统重新读取磁盘信息,可以看到新建的文件了。
举个例子:你要将自己攒的一千万(我可没这么多钱)放在自己家的柜子(FAT磁盘)里,而你又是一个办事有条理的人,你会将自己柜子里的抽屉总数(总簇数)记录一下,而且按照顺序为你的抽屉然后将每个抽屉的使用情况(FAT1)记录在抽屉记录清单上,比如说,0号抽屉不用(保留簇标记)5号抽屉坏了(坏簇标记),6号抽屉里有东西(簇占用标记)。而且,你怕自己将这个记录丢了,所以你又复制了一份一模一样的记录(FAT2),每次放东西都会在两份记录里都写进去。
现在你要将这1000万放在自己的抽屉里(就是这么任性,有钱不存银行),然后,你找到了自己的记录表(FAT1),然后从里面查看还有多少个空抽屉(空闲簇)。
现在你找到了下一个可以用的是7号抽屉。但是1个抽屉存不下你这些钱(文件大于1簇),所以你只好放几个抽屉了,而且你还想知道自己的钱到底是从哪开始放的(文件起始簇),用几个抽屉放(文件总大小),什么时候放的(文件创建时间)等,所以又写一张东西记录清单(根目录区域)。
你为了让自己知道我的钱是放在哪些抽屉里的,然后在原来的抽屉记录清单(FAT1 和FAT2)上将抽屉记录上记录了下一个存钱的抽屉。当这是最后一个存钱抽屉时,你将这个记录改为结束(簇占用标记)。现在你可以把你的钱放在你规划好的抽屉里了(数据区)。
普通删除一个文件时,磁盘中发生了什么?
- 找到文件的目录项,将
文件首簇记录
的高位清0,将目录项记录的第一个自己改为E5
,将文件占用的簇释放掉,也就是在FAT表中
将之前占用的簇记录改为空闲
,然后修改剩余总簇数
,有必要的话,也修改下一可用簇
。
> 不难看出其实文件内容并没有被删除,所以说只要你新建的文件没有覆盖之前文件内容,这个文件是可以被恢复的。
怎么安全删除?
你可以用一些特定工具(比如WinHex)进行彻底删除,本质就是在文件实际内容用0比特或者随机比特进行填充。
FAT文件的隐写
什么是隐写?
百度百科定义:隐写术是关于信息隐藏,即不让计划的接收者之外的任何人知道信息的传递事件(而不只是信息的内容)的一门技巧与科学。隐写术英文作“Steganography”,来源于约翰尼斯·特里特米乌斯一本看上去是有关黑魔法,实际上是讲密码学与隐写术的一本书Steganographia中。此书书名来源于希腊语,意为“隐秘书写”。
本次实验采用的隐写可以说是最简单的隐写了,因为它只是让你从目录中查看不到这个文件信息,如果你用一些磁盘查看工具看到这些东西简直不要太容易!因为本文的重点不是介绍隐写术,而是FAT文件系统,所以不过多讨论。
隐写实验过程
本次实验环境:
操作系统:Windows 8.1 实验工具:磁盘查看工具:WinHex(其他工具也可以)。 百度网盘下载:[WinHex](https://pan.baidu.com/s/1eIxsYH1qtuGw9C0egn1UOg)
工具安装:解压缩以后先打开keygen.exe是注册码生成器,复制注册码,然后点击setup.exe可以选择语言。然后点击winhex.exe 启动文件,再将注册码生成器里生成的内容复制到第一行帮助(help)选项卡中的注册(Register)内容中。
-
先格式化U盘,文件格式选择FAT32,分配单元大小(其实就是簇大小)选择(8192Byte=8KB)。
**目的:**使得簇信息等查看起来简单,方便实验,但不是必须的。
-
查看当前可用簇的总数(一般情况下在1号扇区偏移地址为0x1EB的连续四个字节),以及下一可用簇(在可用簇总数后面的连续四个字节,也就是在1号扇区偏移地址为0X1E的连续四个字节。)。以本次实验为例:A2 B2 18 00是可用簇总数的记录,实际大小为(0X0018B2A2),转化为10进制就是1618594个可用簇。同样地 05 00 00 00是下一可用簇的记录,实际大小为(0x00000005),转化为10进制就是第五簇。
注意:高地址在右边,所以计算时要倒过来写。 ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJSHt7Mk-1597573332627)(file:///C:\Users\斌\AppData\Local\Temp\ksohtml\wps1E57.tmp.jpg)]![img]](https://img-blog.csdn.net/20180610210735574?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N0dWR5X2NvZGVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
-
因为目的是要隐写,所以我们将第五簇用作隐写(在FAT的记录中随便找一项空闲簇都可以),然后将可用簇的总数减去1。然后在FAT1记录中找到第5簇的记录,将它修改为F7FFFFFF,也就是坏簇标记。(改为FFFFFF0F占用标记也可以)
-
找到第五簇,完成实际数据的写入。
-
保存修改,并重新插拔U盘。
-
验证是否成功。
重新插拔U盘,在U盘内随便新建一个文件,验证一下隐写文件是否会被覆盖。验证过程如下:重新用W inhex打开U盘,找到第五簇,看一下刚才写的数据是否还在。如果还在说明成功。不在的话,说明失败。
-
-
fatfs-FAT文件系统库-Rust开发
2021-05-27 19:17:58Rust FAT FS在Rust中实现的FAT文件系统库。 功能:使用标准的读/写特征读取/写入文件读取目录内容创建/重新创建Rust FAT FS Rust中实现的FAT文件系统库。 功能:使用标准的读/写特征读取/写入文件读取目录内容创建/...