FAT32文件系统学习

news2025/1/11 9:57:49

FAT32文件系统组成及介绍
FAT32文件系统结构图:

 下图演示了FAT32文件系统的DBR:

1.DBR及其保留扇区:含义是DOS引导记录,也称为操作系统引导记录,在DBR之后往往有一些保留扇区

跳转指令:跳转指令本身占用2字节,它将程序执行流程跳转到引导程序处,在计算跳转目标地址是以该指令的系以字节为基准。
OEM代号:这部分占8字节,由创建该文件系统的OEM厂商安排。
BPB:FAT32的BPB从DBR的第12个字节开始,占用79字节,记录了有关该文件系统的重要信息,如下:

  •  0BH~0CH:每扇区字节数-记录每个逻辑扇区的大小,一般为512字节。
  •  0DH~0DH: 每簇扇区数-每簇扇区数记录着文件系统的簇大小,即由多少个扇区组成一个簇,FAT32最大支持128扇区的簇。(注意:在FAT32文件系统中所有的簇从2开始进行编号,每个簇都有一个自己的地址编号,并且所有的簇都位于数据区内,在数据区之前是没有簇的)。
  •  0EH~0FH:DBR保留扇区数-DBR本身占用的扇区以及其后保留扇区的综合,也就是DBR到FAT1之间的扇区总数,也是FAT1的开始扇区号。
  • 10H~10H:FAT个数-一般都是指FAT1和FAT2。
  • 11H~12H:这两个字节在FAT16中用来描述FDT中所能容纳的目录项数FAT32没有固定的FDT,所以未用这个参数。
  • 13H~14H:这两个字节在FAT16中用来表示小于32分区的扇区总数,FAT32的总是大于32MB,所以未用这个参数。
  • 15H~15H:介质描述符-介质描述符是描述磁盘介质的参数,根据磁盘性质的不同,取不同的值。
  • 16H~17H:这两个字节在FAT16中用来表示每个FAT表包含的扇区数,FAT32不用这个位置。
  • 18H~19H:每磁道扇区数,一般为63。
  • 1AH~1BH:磁头数,一般为255。
  • 1CH~1FH:隐藏扇区数-指的是本分区之前使用的扇区数,该值与分区表中所描述的该分区的起始扇区号一致。对于主磁盘分区来说,是MBR到该分区之间的扇区数;对于扩展分区中的逻辑驱动器来说,是EBR到该分区DBR之间的扇区数。
  • 20H~23H:扇区总数-指的是分区的总扇区数,也就是FAT32分区的大小
  • 24H~27H:每FAT扇区数-指的是FAT32分区中每个FAT表占用的扇区数。
  • 28H~29H:标志-表示FAT32是否可用,当其二进制最高位置为1时,表示只有FAT1可用。否则FAT2也可用。
  • 2AH~2BH:版本-通常为0。
  • 2CH~2FH:根目录首簇号-分区在格式化为FAT32文件系统时,格式化程序会在数据区中指派一个簇作为FAT32的根目录的开始,并把该簇号记录在BPB中。通常都是把数据区的第一个簇分配给根目录使用,也就是2号簇。
  • 30H~31H:文件系统信息扇区号-FAT32文件系统在DBR的保留扇区中安排了一个文件系统信息扇区,用以记录数据区空闲簇的数量及其下一个空闲簇的簇号,该扇区一般在分区的1号扇区,也就是紧跟着DBR后的一个扇区。
  • 32H~33H:DBR备份扇区号-FAT32文件系统在DBR的保留扇区中安排了一个DBR的备份,一般在6号扇区,也就是第7个扇区。该备份扇区与原DBR扇区的内容完全一致,如果原DBR遭到破坏,可以使用备份扇区恢复。
  • 34H~3FH:未用
  • 40H~40H:BIOS驱动器号-这是BIOS的INT所描述的设备号码,一般把磁盘定义为8xH。
  • 41H~41H:未用
  • 42H~42H:扩展引导标记-用来确认后面的三个参数是否有效,一般值为29H。
  • 43H~46H:卷序列号-卷序列号时格式化程序在创建文件系统时生成的一组4字节的随机数值
  • 47H~51H:卷标-卷标是由用户创建文件系统时指定的一个卷的名称,原来的系统把卷标记录在这个地址处,现在的系统已经不再使用这个地址记录卷标,而是由一个目录项来管理卷标。
  • 52H~59H:文件系统类型-直接用ASCII码记录当前分区的文件系统类型。

引导程序:FAT32的DBR引导程序占用420个字节(5AH~1FDH),这段代码负责完成DOS三个系统文件的装入

结束标志:DBR的结束标志与MBR,EBR的结束标志都相同,为“55 AA”。

以上五个部分共占用512字节,正好是一个扇区,因此称它为DOS引导扇区。该部分的内容中除了第5个部分结束标志是固定不变之外,其余四个部分都是不完全固定的。

通过上面了解到重要信息总结如下:

  • 扇区字节数和每簇扇区数

 硬件扇区的大小为512Bytes,每个簇占用扇区数为32个扇区。

  • 保留扇区数

 我们可以通过保留扇区数可以找到FAT表的起始位置,FAT Table Start Address = 0x4BB0 *   512 = 0x976000 Bytes。确实在地址0x976000位置找到了FAT表

  •  总扇区数

    通过总扇区数可以计算得到SD卡的总容量大小:0x07386880*512=62022287360Bytes

 

  •  根目录开始地址

根目录开始地址 = ((保留扇区数) + (每 FAT 扇区数) * (FAT 数)) * 扇区字节数
根目录开始地址 = (0x4BB0 + 0x00001CE8 * 0x02) * 512 = 0x10B0000Bytes

 ​​​​​

2.FAT1和FAT2:含义是文件分配表,FAT32一般有两份FAT,FAT1是第一份,也是主FAT,FAT2是备份FAT

FAT表的作用及特点:

  • FAT文件系统一般有两份FAT,它们由格式化程序在对分区进行格式化时创建,FAT1是活动FAT,FAT2是备份FAT。
  • FAT1跟在DBR之后,其具体地址由DBR的BPB参数中偏移量为0EH~0FH的两字节描述;FAT2跟在FAT1之后,其地址可以用FAT1所在的扇区号加上每个FAT所占的扇区数获得。
  • FAT表是由FAT表项构成的,我们把FAT表项简称为FAT项。FAT32文件系统的FAT项大小有32位,相当于四字节。
  • 每个FAT项都有一个固定的编号,这个编号从0开始,第一个FAT项是0号FAT项,以此类推。
  • FAT表的前两个FAT项有专门的用途:0号FAT项通常用来存放分区所在的介质类型,1号FAT项则用来存储文件系统的肮脏标志,表明文件系统被非法卸载或者磁盘表面存在错误。
  • 分区的数据区中每一个簇都会映射到FAT表中的唯一一个 FAT项。因为0号FAT项和1号FAT项有特殊用途,无法与数据区中的簇形成映射,所以从2号FAT项开始跟数据区中的第一个簇映射,正因为如此,数据区中的第一个簇也就编号为2号簇,这也是没有0号簇和1号簇的原因,然后3号簇跟3号FAT项映射,4号簇跟4号FAT项映射,以此类推,直到数据区中的最后一个簇。
  • 分区格式化后,用户文件以簇为单位存放在数据区中,一个文件至少占用一个簇。当一个文件占用多个簇时,这些簇的簇号不一定是连续的,但这些簇号在存储该文件时就确定了顺序,即每个文件都有其特定的“簇号链”。在分区上的每一个可用的簇在FAT 中有且只有一个映射 FAT项,通过在对应簇号的FAT 项内填入“FAT 项值”来表明数据区中的该簇是已占用、空闲或是坏簇三种状态之一。其各自对应的范围值如下:

定位FAT表,首先定位FAT1:

  • 系统通过该分区表信息,定位到其DBR扇区。
  • 读取DBR的BPB,通过读取0EH~0FH偏移处“DBR保留扇区数"这个参数。
  • 读取到DBR保留扇区数这个参数之后,跳转到该分区的对应的扇区,这里就是FAT1的开始。

定位完FAT1,再来定位FAT2:

  • 系统通过该分区表信息,定位到其DBR扇区。
  • 读取DBR的BPB,通过读取0EH~0FH偏移处“DBR保留扇区数"这个参数。
  • 读取DBR的24H~27H偏移处,得到每FAT扇区数的值为561。
  • 用DBR保留扇区数加上每FAT扇区数,得到的结果值就是FAT2的开始。

强调:除了0号FAT项和1号FAT项以外,如果一个FAT项为非零值,那么可能有三种情况:除了坏簇标志和结束标志外,还有一种情况就是该FAT项被某个文件占用,但并不是文件的最后一个簇,那么该FAT项中的值就是文件下一个簇的簇号。

3.DATA:DATA是数据区,是FAT32文件系统的主要区域,包括目录区

FAT32文件系统的数据区定位分析

FAT32的数据区在文件系统中的具体位置是紧跟在FAT2之后,以定位DBR所在分区数据区为例,其定位步骤如下:

  • 系统通过该分区表信息,定位到其DBR扇区。
  • 读取DBR的0EH~0FH偏移处,得到"DBR保留扇区数"的值。
  • 读取DBR的24H~27H偏移处,得到每FAT扇区数的值。
  • 用DBR保留扇区数加上2倍的每FAT扇区数,得到结果,跳转到结果所在的扇区,这就是数据区的开始。

FAT32文件系统数据区的内容主要由三部分组成:根目录、子目录和文件内容。

 FAT文件系统目录项分析

什么是目录项?它有什么作用?

  • 分区中的每个文件和文件夹(也称为目录)都被分分配一个大小为32字节的目录项,用以描述文件名或目录名、文件或文件夹的属性、大小、起始簇号和时间、日期等信息(鼠标光标停留在一个电脑文件上时,右边显示的就是目录项)。
  • 在FAT文件系统中,目录被视为特殊类型的文件,所以每个文件也跟目录一样有目录项。

FAT32文件系统目录项有四种:短文件目录项、长文件目录项、"."目录项和".."目录项、卷标目录项

短文件目录项:即8.3格式,在这种限制下,用户在给文件起名时,主文件名不能超过8个字符,并且不能支持中文;扩展名不能超过3个字符,所以称为8.3格式;FAT16和FAT32短文件目录项的不同之处就在偏移“14H”处的两个字节,FAT16是不用这两个字节的,而在FAT32中,这两个字节是其实簇号的高位,偏移“1AH”是起始簇号的低位,这四个字节共同构成文件的其实簇号。

长文件目录项:即文件名8.3格式限制被打破了,超过8.3的格式限制的文件名实际存储着两个名字,一个短文件名和一个长文件名。如果是短文件名,则存储在短文件名目录项中。当创建一个长文件名时,其对应短文件名的存储有以下三个处理原则:

  • 系统取长文件名前6个字符加上"~1"形成短文件名,其扩展名不变。
  • 如果已经存在这个名字的文件,则符号"~"后的数字自动增加。
  • 如果有DOS和Windows 3.x非法的字符,则以下画线"_"替代。

"."目录项和".."目录项:"."表示当前目录,".."表示上级目录。

卷标目录项:卷标就是一个分区的名字,可以在格式化分区时创建,也可以随时修改,目前的系统把卷标当作文件,用文件目录项进行管理,系统为卷标建一个目录项,放在根目录中。

 下面通过一个实例根目录文件:xatu.txt来练习FAT表的使用:

 通过上面实例表格了解到重要信息总结如下:

文件起始簇号
文件起始簇号为0x00000006,说明该文件的起始地址为:
文件地址 = 根目录开始地址 + ((起始簇号 - 根目录簇号(Root Cluster Number)) * 每簇扇区数(Sectors Per Cluster) * 扇区字节数(Bytes Per Sector))
文件地址 = 0x10B0000 + ((0x06 - 2) * 32 * 512) = 0x10F0000 Bytes
经过计算可以得到文件起始存放位置在0x1028000,然后验证果然在该位置找到了文件:xatu.txt存放的数据,如下:

 为了验证是否是这个文件,将上述数据复制出来新建一个文件,保存在桌面,查看如下:

 可以看到文件正确。

学习心得:通过对FAT32文件系统的学习,本人有一种恍然大悟的感觉,在平常的学习生活中,对于电脑或者U盘的文件,我们只是单纯的建立,写入,删除,对于底层的过程也从来没有探究过,比如对于删除的文件,在正常看来,这个文件确实已经没有了,但是通过WinHex分析就会发现,删除的文件底层数据还是在的,只要熟悉文件系统的工作原理,是可以根据基本数据进行恢复的,这对以后的工作生活是非常有帮助的,如果我们不小心误删除了某个文件,就不会感到手足无措了。在刚开始学习时,对于文件系统中那些专业词汇,也感到晦涩难懂,但是多看几遍后,就感到其中的奥妙了。对于技术性的学习,我认为不能像读课文一样逐字逐句的读,本人的学习方式是,先浏览几遍,了解文件系统的框架,然后再对其中的各个部分的进行细读,但是眼过千遍,不如手过一遍,本人会将文件系统的重点概念知识抄写一遍,加深记忆和理解,最后再根据书中的教程在Winhex上进行简单的实际操作,这样能更好的掌握课本上的知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/436525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python程序打包成可执行文件【进阶篇】

python程序打包成可执行文件【进阶篇】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 python程序打包成可执行文件【进阶篇】[TOC](文章目录) 前言安装PyInstaller包打包深度学习模型生成spec文件修改spec文件运行spec文件进行打包执行exe可执…

为什么倒谱可以分析回声

一个有趣的现象:倒谱上的第一个峰,恰好对应回声相比原声的延时。回声 y y y 是原始声音 x x x 延迟 t 0 t_0 t0​ 秒后的、带有衰减 α α α 的副本 y α x ( t − t 0 ) y αx (t - t_0) yαx(t−t0​) 方便起见,这里取 α 1 α …

抖音强势入局服装生意,出手就是1个亿,服装实体店出路在哪?

最近,抖音盯上了服装生意。 据悉,抖音近期组建了一个自营服装团队,在APP推出了一家“飞云织上”的店铺,店铺主体公司是“上海歆湃信息科技有限公司”。 根据爱企查显示,这家公司由抖音集团(香港&#xff09…

RabbitMQ-消息模型

什么是MQ MQ全称是Message Queue,即消息对列!消息队列是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没…

IPV4与IPV6是什么?有什么区别?

目录 一. IPV4是什么? 二. IPV6是什么 三. IPv4和IPv6有什么区别? 1.地址类型 2.数据包大小 3.header区域字段数 4.可选字段 5.配置 6.安全性 7.与移动设备的兼容性 8.主要功能 IP协议(互联网协议)是互联网协议群&#…

USB TO SPI / USB TO I2C 软件概要 6--- 专业版调试器

所需设备: 1、USB转SPI_I2C适配器(专业版); 软件概述: SPI类: USB TO SPI 1.0-Slave SPI从机软件,适合单步调试,支持SPI工作模式0、1、2、3,自动跟随主机通讯速率,自动接收数据; USB TO S…

大城市的IT岗位,饱和了么?

现在学或即将更要学习IT专业的同学,经常会考虑这样一个问题:现在的计算机专业到处都有,大学里有、职业学校有,就连社会上的培训机构也有,而且专业分类更细化,有这么多的地方都在培训计算机相关专业&#xf…

二本4年测龄年仅25岁,五面阿里(定薪25K).....

体验了一下阿里的面试,不愧是大厂,考察范围既有深度也有宽度。努力回想了下面试的内容和自己当时的回答,这里给大家分享下自己的经验,也给自己做个归档,希望能给正在准备跳槽,找工作的朋友一点帮助&#xf…

每一个软件测试工程师都有要牢记的误区

最近跟一些刚刚进入软件测试行业的朋友去交流,发现了一个有趣的现象,就是对于这个行业的很多问题的认识都是一致的片面,当然也可以理解为误区。自己利用一点时间,把他们对于这个行业的认识误区都罗列出来,然后结合自己…

【Python从入门到进阶】16、文件的打开和关闭

接上篇《15、函数的定义和使用》 上一篇我们学习了Python中函数的定义和使用,包括函数的参数、返回值、局部变量和全景变量等操作。从本篇开始我们来开始学习Python对文件的一些操作,本篇我们主要讲解如何使用Python打开和关闭文件。 一、打开/创建文件…

全国青少年编程等级考试scratch四级真题2023年3月(含题库答题软件账号)

青少年编程等级考试scratch真题答题考试系统请点击 电子学会-全国青少年编程等级考试真题Scratch一级(2019年3月)在线答题_程序猿下山的博客-CSDN博客_小航答题助手 1.编写一段程序,从26个英文字母中,随机选出10个加入列表a。空白…

【id:45】【20分】A. Equation(类与对象+构造)

题目描述 建立一个类Equation,表达方程ax2bxc0。类中至少包含以下方法: 1、无参构造(abc默认值为1.0、1.0、0)与有参构造函数,用于初始化a、b、c的值; 2、set方法,用于修改a、b、c的值 3、ge…

JSP原理

1.什么是JSP Java Server Page:Java服务器端页面,也和Servlet一样,用于动态Web技术 最大的特点:写JSP就像再写HTML 页面生成了java JSP本质上就是servlet 3.输出页面前增加的代码 1.response.setContentType("text/html"); //设…

C++ ubuntu环境下安装编译部署环境,用onnxruntime部署ppyoloe_r模型

在新安装的ubuntu环境下修改源、安装gcc和cmake,编译安装opencv,安装onnxruntime环境。并编写cmakelist文件,编译与运行ppyoloe_r模型。 windows环境下onnx部署ppyoloe_r模型的代码可以参考 https://blog.csdn.net/a486259/article/details/1…

Python-入门基础小练习

通过前面的两个篇章Python-入门基础篇和Python-入门基础语句篇大家应该已经认识了python基础的语句和函数了,并且可以使用pycharm编译器创建.py文件进行运行了,今天适当的来一些小练习,给枯燥的学习增添一些趣味性。 判断一个数是否为偶数 …

Node 模块

文章目录 Node 模块概述使用方式一:module.exports方式二:exports 目录模块package.json配置 引入模块的基本流程 Node 模块 概述 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为模块化。 其中拆分出的 每…

Identity标识框架配上JWT的使用

在Identity标识框架的代码上继续编写 .Net中的标识框架Identity_风的艺术的博客-CSDN博客 添加NuGet包 Nuget:Microsoft.AspNetCore.Authentication.JwtBearer 创建存储JWT数据类 public class JWTOptions { public string SigningKey { get; set; } pub…

嵌入式51单片机03-数码管系列

文章目录 数码管一、数码管基础知识二、数码管系列代码1. 数码管操作(单个数码管静态显示)(1)仿真电路图(2)源代码(3)实验结果 2. 数码管操作(多个数码管静态显示&#x…

CSDN官方文章MD编辑器文章示例

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Day950.遗留系统的四化建设 -遗留系统现代化实战

遗留系统的四化建设 Hi,我是阿昌,今天学习记录的是关于遗留系统的四化建设的内容。 对于老旧、过时,但又十分重要、不可替代的遗留系统,是遗留系统。听之任之只会埋下隐患,真正出现问题就为时已晚了。在动手改造遗留…