FAT16文件系统简介
本文转自:《FAT16文件系统简介》
有必要说明一下,以下对FAT16系统的介绍,很多都是参考文献。由于FAT16系统一般在U盘、MMC卡、SD卡以及一些小型存储设备上使用比较多,以后把这些小型存储设备统称为存储卡,这里仅局限于对存储卡的介绍,但很有针对性,而且比较全面。
参考来源:http://www.sjhf.net/pdf/fat.pdf
1.1 存储卡的结构
DBR扇区 |
保留扇区 |
FAT表1 |
FAT表2 |
根目录 |
数据区 |
1.2 DBR扇区:
DBR区(DOS BOOT RECORD)即操作系统引导记录区的意思,也称为引导扇区或启动扇区。它记录了存储卡的所有重要信息,一共512个字节,其结构如图1-2所示:
跳转指令JUMP |
OEM厂商标志 |
BPB和扩展BPB |
引导代码 |
结束标志0xAA55 |
图1-2 DBR结构
为了更好的理解DBR扇区,下面我们可以用WinHex打开一个存储卡,看一下DBR的结构,如图1-3所示。
在图1-3的最下面,可以明显的看到有“55 AA”的字样,这就是启动扇区的结束标志,它为16进制,大端格式,即把高字节放在低地址,高字节放在搞地址,读出来就是0xAA55。以下涉及的数据都是这样存储的。
根据图1-2和图1-3,表1-1给出了引导扇区各个字段的定义和说明。
表1-1 一个FAT16分区上的引导扇区段 |
||
字节位移 |
字段长度(字节) |
字段名称 |
0x00 |
3 |
跳转指令(Jump Instruction) |
0x03 |
8 |
OEM ID |
0x0B |
25 |
BPB |
0x24 |
26 |
扩展BPB |
0x3E |
448 |
引导程序代码(Bootstrap Code) |
0x01FE |
4 |
扇区结束标识符(0xAA55) |
2.1.2.1 跳转指令JUMP
2.1.2.2 OEM厂商标志
2.1.2.3 BPB和扩展BPB
表1-2 FAT16分区的BPB字段 |
|||
字节位移 |
字段长度(字节) |
例值 |
名称、定义和描述 |
0x0B |
2 |
0x0200 |
扇区字节数(Bytes Per Sector) 硬件扇区的大小。本字段合法的十进制值有512、1024、2048和4096。对大多数磁盘来说,本字段的值为512 |
0x0D |
1 |
0x10 |
每簇扇区数(Sectors Per Cluster) 一个簇中的扇区数。由于FAT16文件系统只能跟踪有限个簇(最多为65536个)。因此,通过增加每簇的扇区数可以支持最大分区数。分区的缺省的簇的大小取决于该分区的大小。本字段合法的十进制值有 1、2、4、8、16、32、64和128。导致簇大于32KB(每扇区字节数*每簇扇区数)的值会引起磁盘错误和软件错误 |
0x0e |
2 |
0x0006 |
保留扇区数(Reserved Sector) 第一个FAT开始之前的扇区数,包括引导扇区。 |
0x10 |
1 |
0x02 |
FAT数(Number of FAT)该分区上FAT的副本数。本字段的值一般为2 |
0x11 |
2 |
0x0200 |
根目录项数(Root Entries) 能够保存在该分区的根目录文件夹中的32个字节长的文件和文件夹名称项的总数。在一个典型的硬盘上,本字段的值为512。其中一个项常常被用作卷标号(Volume Label),长名称的文件和文件夹每个文件使用多个项。文件和文件夹项的最大数一般为511,但是如果使用的长文件名,往往都达不到这个数。 |
0x13 |
2 |
0x0000 |
小扇区数(Small Sector) 该分区上的扇区数,表示为16位(<65536)。对大于65536个扇区的分区来说,本字段的值为0,而使用大扇区数来取代它。 |
0x15 |
1 |
0xF8 |
媒体描述符( Media Descriptor)提供有关媒体被使用的信息。值0xF8表示硬盘,0xF0表示高密度的3.5寸软盘。媒体描述符要用于MS-DOS FAT16磁盘,在Windows 2000中未被使用 |
0x16 |
2 |
0x00F5 |
每FAT扇区数(Sectors Per FAT) 该分区上每个FAT所占用的扇区数。计算机利用这个数和FAT数以及隐藏扇区数来决定根目录在哪里开始。计算机还可以根据根目录中的项数(512)决定该分区的用户数据区从哪里开始 |
0x18 |
2 |
0x003F |
每道扇区数(Sectors Per Trark) |
0x1A |
2 |
0x00FF |
磁头数(Number of head) |
0x1C |
4 |
0x000000400 |
隐藏扇区数(Hidden Sector) 该分区上引导扇区之前的扇区数。在引导序列计算到根目录和数据区的绝对位移的过程中使用了该值 |
0x20 |
4 |
0x000F4C00 |
大扇区数(Large Sector) 如果小扇区数字段的值为0,本字段就包含该FAT16分区中的总扇区数。如果小扇区数字段的值不为0,那么本字段的值为0 |
表1-3 FAT16分区的扩展BPB字段 |
|||
字节位移 |
字段长度(字节) |
图8对应取值 |
名称、定义和描述 |
0x24 |
1 |
0x80 |
物理驱动器号( Physical Drive Number) 与BIOS物理驱动器号有关。软盘驱动器被标识为0x00,物理硬盘被标识为0x80,而与物理磁盘驱动器无关。一般地,在发出一个INT13h BIOS调用之前设置该值,具体指定所访问的设备。只有当该设备是一个引导设备时,这个值才有意义 |
0x25 |
1 |
0x01 |
保留(Reserved) FAT16分区一般将本字段的值设置为1 |
0x26 |
1 |
0x29 |
扩展引导标签(Extended Boot Signature) 本字段必须要有能被Windows 2000所识别的值0x28或0x29 |
0x27 |
2 |
0xABA13358 |
卷序号(Volume Serial Number) 在格式化磁盘时所产生的一个随机序号,它有助于区分磁盘 |
0x2B |
11 |
"NO NAME" |
卷标(Volume Label) 本字段只能使用一次,它被用来保存卷标号。现在,卷标被作为一个特殊文件保存在根目录中 |
0x36 |
8 |
"FAT16" |
文件系统类型(File System Type) 根据该磁盘格式,该字段的值可以为FAT、FAT12或FAT16 |
2.1.2.4 引导代码和结束标志
扇区的最后两个字节存储值为0xAA55的DBR有效标志,对于其他的取值,系统将不会执行DBR相关指令。
2.1.2 关于保留扇区
2.1.3 FAT表和数据的存储原则
在FAT文件系统中,文件的存储依照FAT表制定的簇链式数据结构来进行。同时,FAT 文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。
表1-4 FAT16 记录项的取值 |
|
FAT16 记录项的取值 |
对应簇的表现情况 |
0x0000 |
未使用的簇 |
0x0002~0xFFEF |
已分配的簇 |
0xFFF0~0xFFF6 |
系统保留 |
0xFFF8~0xFFFF |
文件结束 |
FAT表记录项存放的数据是它下一个FAT表项的位置,我们来分析一下图1-5的FAT表,相对偏移量0x4~0x5的数据是0xFFFF,表示存储在这一簇上的文件(或目录)只占用1个簇的空间。偏移量0x6~0x7的数据是0x0004,指向了第4簇,也就是说这个文件还没有结束,它还有数据存放在第4簇,我们找到第4簇,也就是偏移量0x08~0x09的地方,数据是0x0005,这个文件的数据也没有结束,它指向了第5簇,我们这样一直找下去,直到找到偏移量为0x14~0x15的地方,数据位0xFFFF,表明这个文件到此就结束了,可以算的这个文件大小占8个簇。
2.1.4 根目录
FAT文件系统的目录结构其实是一颗有向的从根到叶的树,这里提到的有向是指对于FAT 分区内的任一文件(包括文件夹),均需从根目录寻址来找到。可以这样认为:目录存储结构的入口就是根目录。
表1-5 目录项字段定义 |
|||
偏移地址 |
字节数 |
说明 |
|
0x00~0x07 |
8 |
文件名 |
|
0x08~0x0A |
3 |
扩展名 |
|
0x0B |
1 |
属 性 |
00000000(读写) 00000001(只读) 00000010(隐藏) 00000100(系统) 00001000(卷标) 00010000(目录) 00100000(归档) |
0x0C~0x15 |
10 |
保留 |
|
0x16~0x17 |
2 |
文件最近修改时间 |
|
0x18~0x19 |
2 |
文件最近修改日期 |
|
0x1A~0x1B |
2 |
文件的首簇号 |
|
0x1C~0x1F |
4 |
文件长度大小 |
以下对表1-5中的一些取值进行说明:
1、对于短文件名,系统将文件名分成两部分进行存储,即主文件名+扩展名。0x0~0x7 字节记录文件的主文件名,0x8~0xA记录文件的扩展名,取文件名中的ASCII码值。不记录主文件名与扩展名之间的"." 主文件名不足8 个字符以空白符(20H)填充,扩展名不足3个字符同样以空白符(20H)填充。0x0 偏移处的取值若为00H,表明目录项为空;若为E5H,表明目录项曾被使用,但对应的文件或文件夹已被删除。(这也是误删除后恢复的理论依据)。文件名中的第一个字符若为“.”或“..”表示这个簇记录的是一个子目录的目录项。“.”代表当前目录;“..”代表上级目录(在dos中,使用命令“cd ..“就是返回上一级目录)。
2、偏移量0x16~0x17中的时间=小时*512+分钟*32+秒/2。偏移量0x18~0x19中的日期=(年份-1980)*512+月份*32+日。得出的结果换算成16 进制填入即可。
3、偏移量0x1A~0x1B存放文件或目录的表示文件的首簇号,系统根据掌握的首簇号在FAT表中找到入口,然后再跟踪簇链直至簇尾,同时用0x1C~0x1F处字节判定有效性。就可以完全无误的读取文件。
说明:由于篇幅过长,这里就不对长文件名和子目录的存储方式进行说明了。FAT16虚拟文件系统我已实现(已上传),创建的虚拟硬盘有启动扇区,保留扇区,fat表和更目录,可用WinHex工具(已上传)查看里面的内容,和一个真实硬盘没有区别,我还设计了数据恢复的功能。
PS:
FAT16文件系统:FAT的全称为File Allocation Table,即“文件分配表”。FAT分为16位与32位两个不同的版本。如果只说“FAT”,则专指FAT16文件系统。FAT16文件系统的兼容性好,可以被MS-DOS、 Windows及其他多种操作系统识别,但是由于不支持大于2GB的硬盘, 现在已被淘汰。
文件系统的缺点:磁盘利用效率低
因为在Windows系统中,磁盘文件的分配是以“簇”为单位的,一个簇只分配给一个文件使用,不管FAT16这个文件占用整个簇容量的多少。由于这个原因,即使一个很小的文件,它也要占用了一个簇,剩余的空间便全部闲置在那里,形成了磁盘空间的浪费。由于分区表容量的限制,FAT16支持的分区越大,磁盘上每个簇的容量也越大,造成的浪费也越大。
【注意】:分区格式也被称为“文件系统”,例如,FAT16、FAT32、NTFS、 EXT2、EXT3等都属于文件系统。每个分区必须使用一种文件系统,才能存取数据。没有文件系统的分区是无法使用的。
FAT16文件系统简介相关推荐
- Linux基础知识与文件系统简介
Linux基础知识与文件系统简介 参考文献:Ubuntu Linux 基础教程 Linux是在什么样的历史背景下出现的 Linux的诞生与发展与UNIX系统.Minix系统.Internet.GNU计 ...
- linux文件系统简介_Linux文件系统简介
linux文件系统简介 本文旨在对Linux文件系统概念进行非常高级的讨论. 它无意于对诸如EXT4之类的特定文件系统类型如何工作进行低级描述,也无意于成为文件系统命令的教程. 每台通用计算机都需要将 ...
- 2021年大数据Hadoop(七):HDFS分布式文件系统简介
2021大数据领域优质创作博客,带你从入门到精通,该博客每天更新,逐渐完善大数据各个知识体系的文章,帮助大家更高效学习. 有对大数据感兴趣的可以关注微信公众号:三帮大数据 目录 HDFS分布式文件系统 ...
- 操作系统实验——简易FAT16文件系统的实现
操作系统实验--简易FAT16文件系统的实现 前言 实验要求 FAT16基础知识 磁盘组成部分 分区原理 思路 完整代码 前言 暑假啦!呼,所有的补课终于也都结束了,虽然绩点还是一如既往的拉跨,但是很 ...
- 【视频块文件系统不得不说的故事】VBFS文件系统简介
在视频监控项目中,录像是必须且至关重要的一个基本功能,可以说录像质量及稳定性在很大程度上就反映了一个监控产品的好坏. 传统的文件系统在长时间大容量的录像并发生覆盖时往往存在以下三方面的问题: 1)文件 ...
- GFS分布式文件系统简介及部署——让存储变得更高级
GFS分布式文件系统简介及部署 一.GFS概述 1.文件系统 ①.文件系统组成 ②.文件系统的作用 ③.专业术语 二.GFS特点 三.GFS工作原理 四.GFS卷 1.GFS卷类型 2.三大基本卷的特 ...
- 电子工程师名片——FAT16文件系统(转)
源:电子工程师名片--FAT16文件系统 从8月8号开始,连续一个月利用每天下班时间和周末的时间终于初步完成了一个电子工程师的电路板名片,就像U盘一样,不过这个FLASH只有64KB的大小,用的单片机 ...
- FAT16文件系统解析(C 版本)
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 今天FA ...
- android 读写sd文件系统,SD卡FAT16文件系统的学习笔记
一.读文件的流程读物理扇区0,得到引导扇(逻辑扇区0)的偏移地址. 读引导扇的内容,得到文件系统基本配置信息. 根据文件系统的基本配置信息计算FAT,FDT,数据簇的起始地址和大小. 根据要读的文件名 ...
最新文章
- $\be$-QGE 的弱强唯一性
- 【工作感悟】——聊聊面试那些事
- 数据库毗连过多的错误,年夜概的启事分解及措置惩罚行动
- python视窗编程_[PYTHON] 核心编程笔记(19.图形用户界面编程)
- 用IMAP4访问Exchange邮箱:Exchange2003系列之七
- uefi引导linux_使用UEFI双重引导Windows和Linux
- 效率提升工具--高级剪贴板Ditto Ditto - Windows剪贴板增强小工具,方便复制粘贴多条记录
- 语音识别概念午后大跌 语音识别概念股一览表
- 七、VueJs 填坑日记之渲染一个列表
- 7月新的开始 - Axure学习05 - 元件库的创建
- 【数学与算法】泰勒公式_线性化_雅各比矩阵_黑塞矩阵
- 谷歌“Adobe Flash Player已被屏蔽”的解决办法
- 如何使用IP访问阿里云服务器
- linux里的.mht是什么文件,Linux下阅读MHT文件
- SQL like子查询
- struts的框架介绍
- RCEP正式生效,对东南亚的跨境电商将带来哪些影响?
- 操作系统中文件系统-文件的分类
- PSP 自制程序 小记
- android并发命令,Android开发实践:基于命令模式的异步任务线程