FAT16 FAT32 文件系统

2023-11-06

FAT,英文为File Allocation Table,文档分配表。

先要记住几个概念:

扇区:一般扇区为512个字节。

簇:由若干个扇区组成。

而FAT文件系统(其他文件系统应该相似)就是专门管理这些簇的。一个文件可能占据一个或者多个簇,按正确的顺序去读取这些簇,就可以获取这个文件的内容了。

FAT16, FAT32的区别

FAT16是用16位即2个字节来表示一个簇,这2个字节有两重意思。第一,它本身所在的位置对应一个特定位置的簇。第二,它的内容指向的是下一个2个字节。

而FAT32是用32位即4个字节来表示一个簇。这4个字节的意思和FAT16中2个字节的意思相同。

2个字节取值范围是0x0000-0xFFFF。4个字节的取值范围是0x00000000-0xFFFFFFFF。但是它们真正的有效范围如下表:

FAT记录项

看之前可以先详细看看下面的网址。

参考网址:

http://wenku.baidu.com/link?url=BpR7QQNeY2fOJGWg0M5AB-DTy9OlR5rJc4tn77dtObFJOUoT5laUi0ScspjsIacrx1lZIzBVnxWL7HIkyDk2nCrlkPBeVh6KfiME_4xt56u

http://wenku.baidu.com/view/c0656e1ea300a6c30c229f15.html

http://blog.csdn.net/new_abc/article/details/7409279

http://wenku.baidu.com/view/45817b49cf84b9d528ea7a99.html

http://www.cnblogs.com/andtt/articles/2352820.html

相信看了上面网址的内容,下面的就可以忽略了。

FAT文件系统的组成一般有MBR,DBR,FAT1,FAT2,FDT和数据区组成。FAT16和FAT32差别不大。一般将DBR所处的位置称谓逻辑扇区0。既然DBR是逻辑上的扇区0,那么怎么能够找到它嘞。MBR是物理上的扇区0,即绝对地址0处。通过MBR可以获取DBR的绝对地址。

以SD卡为例简要说明FAT32:

FAT32的结构

MBR-保留扇区0-DBR-FSINFO-保留扇区1-DBR副本-FSINFO副本-保留扇区2-FAT1-FAT2-根目录FDT-数据区

FAT表结构

通过WinHex可以以物理和逻辑两种方式来打开SD卡。在这里用物理方式打开,分别查找FAT32结构中的信息。

FAT文件系统最初是在IBM PC机上实现的,因此磁盘上的数据都是按"小端"模式"存储的。

MBR

下图是一个4G sd卡的MBR信息,图中只标出了感兴趣的内容。

4G-SD-MBR

保留扇区0

在MBR中可以看到此处保留扇区为0x00002000-1个扇区,因为第0x00002000个扇区是DBR。如果在没有MBR的分区中,当然也就不存在保留扇区0了。

DBR

有时可能没有MBR。DBR的物理地址和逻辑地址相同,都是0地址。)

由MBR图可知,DBR所在的扇区在8192物理扇区处。即8192*512=4194304D=400000H=4MB处。在WinHex中跳转到此处。

在DBR中可以得出DBR之后结构的信息。

DBR

其中:

标号3保留扇区数,意为此扇区加上这么多扇区就是FAT1的扇区地址了。此处为:0x400000H+0x24H*0x200H

标号5为此扇区之前有多少个空余扇区,和MBR中指向DBR扇区地址是完全一致的。

标号6为磁盘扇区总数。关于这里的总数包括哪些扇区呢?经过观察几个U盘和SD卡,发现这里的扇区总数是从DBR开始在内的共0x760000个扇区。即此盘的最后地址为0x400000+0x760000*0x200-1=0xEC400000-1=0xEC3FFFFF。这个地址是SD的物理地址的最末尾。

标号9为FSINFO扇区地址,即此扇区加上这么多就是FSINFO的扇区地址了。此处为:0x400000H+0x200H

标号10为DBR的备份扇区相对地址。此处为:0x400000H+0x06*0x200

问题1:如果将MBR和DBR中的磁盘扇区总数修改会出现什么情况?(这个问题可以看了上面的网址和这篇博文后理解)

答:关于这一点,在上面网址中的FAT白皮书中也有说明(第6页)。现结合自己理解谈谈。

1>如果将MBR和DBR中的磁盘扇区总数同时减小,比如减小为0x3FE000,即磁盘的最后地址为0x400000+0x3FE000*0x200-1=0x80000000B-1=2GB,即磁盘变成了2G的了。就是说在FAT扇区数没有变化的情况,磁盘可以使用的FAT文件系统变小了。但是FAT表占的扇区数是不会变的。上面说扇区总数同时减小,是的,如果不同时减小,可能文件系统检测是会出异常。可知,可以减少磁盘扇区总数达到减小FAT文件系统的目的,当然磁盘扇区总数后面的地址数据将不会被刷新。

2>如果将MBR和DBR中的磁盘扇区总数同时增大,会出现什么情况呢。

针对FAT32,4个字节表示一个簇。那么一个扇区可以表示512/4=128个簇。(假设每个扇区有512字节,最好使用此值)。如果一个簇4k,那么FAT表的一个扇区可以表示512k。我们知道,FAT表是以扇区数来计算个数的。因此,FAT表的最末尾扇区中有可能有空余字节。如果增大扇区总数,那么FAT文件系统就会去寻址磁盘最大容量以外的地址(可能会出现异常),而且FAT表最末尾的空余字节就会被使用。FAT白皮书上说导致数据丢失,可能就是超出磁盘最大容量地址以外的那部分数据吧。原有的数据应该不会丢失。

DBR备份扇区和DBR扇区完全一样

FSINFO

根据DBR中的信息,可知道FSINFO的地址为0x400200

FSINFO

Note:

剩余簇数量:保存最新的剩余簇数量,如果为0xFFFFFFFF表示剩余簇未知,需要重新计算,除此之外其他的值都可以用,而且不要求十分精确,但必须保证其值<=磁盘所有的簇数。

下一个可用簇:该域为FAT驱动程序提供一条有利的线索,它告诉驱动程序从哪里开始寻找剩余簇。因为FAT32的FAT表可能非常的庞大,如果已经分配的簇很多的话要从头开始查找剩余簇将耗 费大量时间。通常这个值被设定为驱动程序最后分配出去的 簇号。如果值为0xFFFFFFFF,那么驱动程序必须从簇2开始查找,除此之外其他的值都可以使用,当然前提是这个值必须合法的。

保留扇区1

此处为5个,因为第6个是DBR备份扇区。(DBR结构中已说明)

DBR副本(DBR中已说明)内容和DBR完全一致,用于DBR访问出错时,来恢复DBR。

FSINFO副本(DBR副本+FSINFO相对于DBR的位置)FSINFO的副本与FSINFO并不是完全一致

保留扇区2

在DBR结构中知道,DBR到FAT1中间有36个扇区,减去里面的FSINFO,保留扇区1,DBR副本,FSINFO副本,就是保留扇区2的数量了。

FAT1

FAT1的地址在DBR中就可以看出来了,即DBR的地址加上保留扇区数就是FAT1的地址。即:0x400000+0x24*0x200=0x404800。如下图所示。

FAT1

FAT32是用4个字节表示一个簇。第0簇和第1簇事先被占用。数据区是从第2簇开始的。

第2簇中的数据为结束簇,它又是根目录簇,说明了,根目录下面的文件数小于4k/32=128个文件(4k表示1个簇的大小,32表示32个字节代表1个文件或目录)。如果根目录下面的文件数大于128,那么FAT表中第2簇的位置应该存的是指向下一个根目录簇的位置。

如下图:

第2簇

上图中FAT表中第2簇位置数据位0x76FA,表示根目录的下一簇在0x76FA簇处。由于数据区是由第2簇开始的,因此计算0x76FA簇的位置为,第2簇的位置+(0x76FA-2)*4k=0x0B61000+76F8000=0x8259000地址处。如上图。第2簇的位置计算下面有方法。

问题2:FAT表表示的最大空间和MBR/DBR中的最大磁盘总数相等么?

答:以FAT32举例。4个字节表示一个簇,但是第一个扇区中只能表示(512-8)/4=126个簇,之外的每个扇区可以表示128个簇。总共有0x1D72个扇区(DBR中可知)。即可以表示这么多簇:126+128*(0x1D72-1)=964862。每簇4k,964862*4k=3859448kB。即可以表示3859448kB的数据。数据区是从FDT开始的,FDT的地址为0x0B61000。那么FAT表所占扇区表示的最大地址空间是:0x0B61000+3859448kB-1=0x0EC45F000-1=0xEC45EFFF。根据DBR中扇区总数可以计算出此盘的最大地址为:0xEC3FFFFF。所以FAT表表示的最大地址空间比扇区总数计算出来的最大地址多:0xEC45EFFF-0xEC3FFFFF=0x5F000=389120B=380kB。因此可以得知,FAT表的最末尾扇区并没有被完全使用,准确的说最末尾扇区只用到了前面的512-380=132个字节。

问题3:在不改变磁盘扇区总数的前提下,怎么减小此盘文件系统的大小,或者说超过某个地址空间以后不能写入新的数据。

答:类似于问题1。同样假如超过地址空间2GB之后的地址不写入新的数据。

我们知道,FAT表中每4个字节都代表了特别的含义。如上面的表格所示。我们可以将FAT表中某扇区之后的数据置成坏簇,那么这些置成坏簇的FAT表扇区,FAT文件系统将不会去刷新对应空间的数据。从而让FAT文件系统假象地认为对应的空间已经被占据了。

那么对应到此题,应该怎么解决呢?只要找到2GB地址对应到的FAT表扇区位置就可以了。从数据区起始地址到2GB地址处空余:0x0B61000+X=2147483648B(2GB),得出X=2135552000B=2085500kB。这个值就是FAT表要表示的最大地址空间了。那么:(126+128*(Y-1))*4kB=2085500kB得出,Y=4073.2578125。即要占FAT表的前4073.2578125扇区(包括FAT表的第一个扇区)。再准确点,FAT表的前4073个扇区被完全使用,第4074个扇区使用了0.2578125*512=132个字节。如果FAT文件系统使用FAT表第4074扇区第132个字节之后的扇区数据时,可以返回给文件系统坏簇的信息。也就意味着2GB之后的空间不能使用了。从而达到了超过某一地址空间后不能写入新的数据。

FAT2

FAT2的地址为FAT1地址+FAT所占的扇区数。从DBR中可以得知,FAT2起始地址为:0x404800+0x1D72*0x200=0x7B2C00

根目录FDT(根目录通常位于第2簇)

FDT的地址紧挨着FAT2,FDT地址就为FAT2加上FAT扇区数。即0x7B2C00+0x1D72*0x200=0x0B61000

根目录占1簇,4kB,一个文件或目录占用32个字节。文件或目录的簇号就位于这32个字节之后。上面的网址有详细介绍,此处不再赘述。

数据区

其实根目录所在的位置已经是数据区了。这里的数据区是根目录后面的数据。在本例中,每簇为8个扇区,即4k。根目录所占1簇,即4k。那么此处的数据区地址为0x0B61000+4k=0x0B62000


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FAT16 FAT32 文件系统 的相关文章

  • Linux文件系统--文件类型

    Linux中一切都是文件 xff0c 文件类型有多种 xff0c 使用ls l命令可以查看文件属性 xff0c 所显示结果的第一列的第一个字符用来表示文件类型 xff0c 如下 xff1a 1 普通文件 第一列第一个字符为 的文件为普通文件
  • 文件系统XFS和EXT4的区别

    XFS和EXT4都是Linux系统中的文件系统 下面是它们之间的一些主要区别 xff1a 文件系统大小限制 xff1a EXT4最大支持16TB的文件系统和1EB的文件大小 而XFS最大支持8EB的文件系统和8EB的文件大小 文件系统碎片
  • 我看ACfly也用到了FatFs文件系统!

    我看ACfly也用到了FatFs文件系统 xff01 是不是ACfly也涉及到读写SD卡 xff0c 看来ACfly涉及到的嵌入式的知识点还挺多的 xff01 xff01 xff01 xff01 xff01 xff01 把ACfly的工程啃
  • Linux文件系统(四)文件系统管理命令

    1 文件系统的基本操作 2 目录的基本操作 3 查看文件内容 4 文件类型 5 查询文件 6 其他管理命令
  • ROS学习:ROS文件系统--package.xml

    package xml 也是一个 catkin的package 必备文件 xff0c 它是这个软件包的描述文件 xff0c 在较早的ROS 版本 rosbuild 编译系统 中 xff0c 这个文件叫做 manifest xml xff0c
  • 在NAND FLASH上建立YAFFS2文件系统

    在NAND FLASH上建立YAFFS2文件系统 xff08 一 xff09 By on 2006 07 22 经过了半个多月的努力 xff0c 终于搞定nandflash的mtd驱动和上层的yaffs2文件系统 这半个多月来几乎每天都要和
  • 六、操作系统之文件管理

    六 文件管理 文件系统的概念 文件系统时OS与用户关系最紧密的一部分 对用户来说 它是OS中最直观的部分 能否方便使用OS 以及OS的可信赖程度往往取决于文件系统的功能和性能 1 文件和文件系统 2 文件系统的功能 3
  • 一文让你彻底了解Linux内核文件系统(大总结)

    一 文件系统特点 文件系统要有严格的组织形式 使得文件能够以块为单位进行存储 文件系统中也要有索引区 用来方便查找一个文件分成的多个块都存放在了什么位置 如果文件系统中有的文件是热点文件 近期经常被读取和写入 文件系统应该有缓存层 文件应该
  • Ext4文件系统介绍 - 理论篇

    Overview ext4文件系统分割成多个block groups 为了解决碎片化问题 block allocator尽量将一个文件的block放在一个group中 block groups的size通过sb s blocks per g
  • ext4 delay allocation之ext4_writepages页回写源码剖析

    概述 ext4 write写入pagecache之后 再合适的时机会回写到磁盘 ext4文件系统中是通过ext4 writepages写入磁盘 本来将在源码角度分析该过程 建议先参照ext4 delay allocation数据结构 ngi
  • 基于S3C2440之TQ2440文件系统yaff2制作步骤

    TQ2440 yaff2文件系统制作 环境 开发板 tq2440 2M NOR 256 NAND W43 虚拟机 ubuntu14 04 LTS 编译器版本 arm linux gcc 4 3 2 busybox版本 busybox 1 1
  • GFS 阅读笔记

    这篇博客是我阅读著名的 GFS 论文 The Google File System 所总结的笔记以及自己一些的思考 这篇论文是一篇非常经典的论文 尤其对于想要了解分布式或者刚刚开始研究分布式的人来说 是一篇非常好的读物 它里面提到了许多分布
  • Linux vfs各种operation操作介绍

    1 ext4文件系统定义的各种操作 普通文件操作 const struct file operations ext4 file operations llseek ext4 llseek read iter generic file rea
  • 一文让你彻底了解Linux内核文件系统

    一 文件系统特点 文件系统要有严格的组织形式 使得文件能够以块为单位进行存储 文件系统中也要有索引区 用来方便查找一个文件分成的多个块都存放在了什么位置 如果文件系统中有的文件是热点文件 近期经常被读取和写入 文件系统应该有缓存层 文件应该
  • 【S5P6818】最小文件系统制作

    00 目录 文章目录 00 目录 01 BusyBox概述 02 下载BusyBox 03 编译BusyBox 04 最小文件系统制作 05 设置开发板参数 06 讨论 07 附录 01 BusyBox概述 BusyBox 是一个集成了三百
  • qml 实现展示本地文件系统

    遍历本地文件 qt 提供了很多种便利类来实现本地的文件系统管理 比如QDirModel和QFileSystemModel qml中又提供了FolderListModel 需要包含Qt labs folderlistmodel 2 0 笔者的
  • 自动精简配置(Thin provisioning )介绍

    自动精简配置 Thin provisioning 介绍 自动精简配置 有时也被称为 超额申请 是一中重要的新兴存储技术 本文定义了自动精简配置 并介绍它的工作原理 使用局限和一些使用建议 如果应用程序所使用的存储空间已满 就会崩溃 因此 存
  • GPT概述

    全局唯一标识分区表 GUID Partition Table 缩写 GPT 是一个实体硬盘的分区结构 它是可扩展固件接口标准的一部分 用来替代BIOS中的主引导记录分区表 传统的主启动记录 MBR 磁盘分区支持最大卷为 2 2 TB ter
  • 深入理解操作系统原理之文件系统

    一 概述 操作系统对系统的软件资源 不论是应用软件和系统软件 的管理都以文件方式进行 承担这部分功能的操作系统称为文件系统 1 文件 计算机系统对系统中软件资源 无论是程序或数据 系统软件或应用软件都以文件方式来管理 文件是存贮在某种介质上
  • FAT32 每个目录的文件数限制

    我目前正在尝试在 Xilinx Kintex 7 卡上用 C 语言编写 FAT 系统 它配备了 MicroBlaze 我已经成功创建了大部分所需的功能 我面临的问题是关于文件夹的总容量 我在网上读到 在 FAT32 中 一个文件夹应该能够包

随机推荐

  • 测试环境搭建及维护

    搭建良好的测试环境是执行测试用例的前提 也是完成测试任务顺利完成的保证 测试环境大体可分为硬件环境和软件环境 硬件环境包括测试必须的PC机 服务器 设备 网线 分配器等硬件设备 软件环境包括数据库 操作系统 被测试软件 共存软件等 特殊条件
  • GD32替代STM32全过程记录

    一 前言 最近半导体行业出现的缺货浪潮 各种芯片价格飙升 像一些常用芯片如STM32F103C8T6 从去年的5块一片涨价到现在的65一片 涨幅17倍 在这种情况下 大家纷纷在找一些国产芯片来替代ST的芯片 而在国产中做的比较好的芯片就是兆
  • 精讲!查看和控制进程相关命令

    这里写目录标题 一 查看进程的相关命令 1 ps 命令 查看静态的进程统计信息 Processes Statistic 2 top 命令 查看进程动态信息 3 pgrep 命令 查询进程信息 4 pstree 命令 查看进程树 二 控制进程
  • HNU数据库系统概论 ODBC

    说些什么 这里感谢我的那位超酷的朋友 感谢他愿意在我困惑的时候为我伸出援手 我这次是用的kingbase和mysql 记得当时出现了蛮多问题的 不过现在我已经不记得出了什么问题了 实验目的 学会配置ODBC数据源 熟悉使用ODBC来进行数据
  • 软件设计和开发规范(国标)

    软件开发规范 包括 1 操作手册 GB8567 88 doc 2 测试分析报告 GB8567 88 doc 3 测试计划 GB8567 88 doc 4 概要设计说明书 GB8567 88 doc 5 开发进度月报 GB8567 88 do
  • ECS共享型n4云服务器1核2G怎么样?

    这个是属于阿里云的ecs服务器 属于vps虚拟服务器 100 的cpu性能无约束 适用于中小型网站搭建等应用 共享型服务器有最新一代的共享型S6 也有共享型n系列的 他们都是属于动态cpu调度模式 共享型实例采用非绑定CPU调度模式 每个v
  • derby性能测试

    derby测试条件 次数 运行ms derby测试条件 次数 运行ms 网络 磁盘模式 1 1360 嵌入式 磁盘模式 1 906 全部删除数据 2 1000 全部删除数据 2 875 1000数据写入 3 984 1000数据写入 3 9
  • Linux系统中查询发行版本号以及内核版本的命令总结

    了解Linux发行版本的版本号是一项非常重要的事情 大多数软件对系统的版本都有要求 发行版本号与软件不匹配 软件将无法安装或者无法使用 这边集合市面上流行的Linux发行版本版本号查询方法 有了这边文章 老板再也不担心我装错软件了呢一 发行
  • Vue3通透教程【四】Vue3组合API初体验

    文章目录 写在前面 组合式 API 是什么 直观组合式API 写在最后 写在前面 专栏介绍 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章 应粉丝要求开始更新 Vue3 的相关技术文章 Vue 框架目前的地位大家应该都晓得 所谓三
  • react+antd的RangePicker日期选择器实现只选择一天内或者7天内的时间的方法

    需求是选择范围日期选择器 需要是第一个选择时间的一天内 直接上代码 设置不可选择时间 const dates setDates useState const disabledDate current gt if dates return f
  • Ubuntu 17.04 将取消 Swap 分区?

    Canonical 的软件工程师 Dimitri John Ledkov 最近宣布即将发布的 Ubuntu Linux 系统安装时将丢弃 Swap 分区方式 改为交换文件方式 对我们中的大多数使用带 SSD 或 NVMe 闪盘及内存充足的人
  • linux(centOS7)的基本操作(二) 目录和文件管理

    1 显示当前工作目录的绝对路径 pwd 2 显示当前工作目录下的子目录和文件 ls l h a 如果只调用ls 子目录和文件会简单的罗列出来 l表示将其以详细列表的形式展示 h表示以适合人阅读的格式显示 a表示同时显示隐藏目录或文件 即以点
  • 网络安全学习之攻防世界[刷题笔记]

    网络安全学习 攻防世界 刷题笔记 Web方向 新手区 view source robots backup cookie2 disabled button weak auth simple php get post 攻防世界 刷题笔记 Web
  • hibernate学习之在intellij idea下使用maven创建hibernate项目(详细图文教程)

    在上次学习hibernate基础了解之后 这里再次进行intellij idea IDE使用maven进行hibernate的安装 并跑通一个HelloWord 环境 windows 7 64位 intellij idea maven hi
  • 【100%通过率 】【华为OD机试 c++ 】数字加减游戏【 2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 数字加减游戏 小明在玩一个数字加减游戏 只使用加法或者减法 将一个数字s变成数字t 每个回合 小明可以用当前的数字加上或减去一个数字 现在有两种
  • PyTorch-07 卷积神经网络(什么是卷积、卷积神经网络、池化层、Batch normalization、经典卷积网络、深度残差网络 ResNet、nn.Module、数据增强)

    PyTorch 07 卷积神经网络 什么是卷积 卷积神经网络 池化层 Batch normalization 经典卷积网络 LeNet 5 AlexNet VGG GoogLeNet 深度残差网络 ResNet nn Module 使用nn
  • Python No module named ‘mlxtend‘ 解决方法

    做了以下尝试 pip install mlxtend安装失败 conda install mlxtend安装失败 anaconda里搜索找不到 最终解决办法 在anaconda prompt界面输入conda install c conda
  • 2023年计划

    2022年技师职业资格国家以年限不够为由 拒绝录入 十分生气 痛定思痛 一步步来 1 申报初级职称 2 因2022年疫情全年取消考试 现疫情政策已放开 上半年考高项 2 2023年领证 4 下半年学习英语 在职 5 学习代码 完全学会spr
  • 【Vue3】学习笔记-响应式ref

    Vue3 学习笔记 响应式ref vite创建Vue3项目 Vue3 声明全局变量 响应式ref 总结 vite创建Vue3项目 npm 7 用以下指令 npm init vite latest my vue app template vu
  • FAT16 FAT32 文件系统

    FAT 英文为File Allocation Table 文档分配表 先要记住几个概念 扇区 一般扇区为512个字节 簇 由若干个扇区组成 而FAT文件系统 其他文件系统应该相似 就是专门管理这些簇的 一个文件可能占据一个或者多个簇 按正确