热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

FAT32文件系统结构分析

FAT,英文为FileAllocationTable,文档分配表。先要记住几个概念:扇区:一般扇区为512个字节。簇

        FAT,英文为File Allocation Table,文档分配表。先要记住几个概念:
        扇区:一般扇区为512个字节。
        簇:由若干个扇区组成,是存取数据的最小单位。如果簇大小为16K,文件大小为1字节,那也要用一个簇来存,而且该簇不用再拿来他用。

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

一、FAT32基本结构

FAT32基本结构依次为:DBR及其保留扇区、FAT表1、FAT表2、根目录和数据区。

1、DBR及其保留扇区

        DBR是文件系统的引导扇区,位于第0号扇区,它记录着文件系统的起始位置、大小、FAT表个数及大小等相关信息。后面跟着由若干个扇区组成的保留扇区,保留扇区的大小记录在DBR中。

0x00~0x02:3字节,跳转指令。
0x03~0x0A:8字节,文件系统标志和版本号,这里为MSDOS5.0。
0x0B~0x0C:2字节,每扇区字节数,0x0200=512字节
0x0D~0x0D:1字节,每簇扇区数,0x08个。
0x0E~0x0F:2字节,保留扇区数,0x0C22=3106个。
0x10~0x10:1字节,FAT表个数,0x02。
0x11~0x12:2字节,FAT32必须等于0,FAT12/FAT16为根目录中目录的个数;
0x13~0x14:2字节,FAT32必须等于0,FAT12/FAT16为扇区总数。
0x15~0x15:1字节,哪种存储介质,0xF8标准值,可移动存储介质。
0x16~0x17:2字节,FAT32必须为0,FAT12/FAT16为一个FAT 表所占的扇区数。
0x18~0x19:2字节,每磁道扇区数,只对于“特殊形状”(由磁头和柱面分割为若干磁道)的存储介质有效,0x003F=63。
0x1A~0x1B:2字节,磁头数,只对特殊的介质才有效,0x00FF=255。
0x1C~0x1F:4字节,EBR分区之前所隐藏的扇区数,0x0004A800=305152又出现了呢,与MBR中地址0x1C6开始的4个字节数值相等。
0x20~0x23:4字节,文件系统总扇区数,0x00E83800=15218688
0x24~0x27:4字节,每个FAT表占用扇区数,0x000039EF=14831
0x28~0x29:2字节,标记,此域FAT32 特有。
0x2A~0x2B:2字节,FAT32版本号0.0,FAT32特有。
0x2C~0x2F:4字节,根目录所在第一个簇的簇号,0x02。(虽然在FAT32文件系统下,根目录可以存放在数据区的任何位置,但是通常情况下还是起始于2号簇)
0x30~0x31:2字节,FSINFO(文件系统信息扇区)扇区号0x01,该扇区为操作系统提供关于空簇总数及下一可用簇的信息。
0x32~0x33:2字节,备份引导扇区的位置。备份引导扇区总是位于文件系统的6号扇区。
0x34~0x3F:12字节,用于以后FAT 扩展使用。
0x40~0x40:1字节,与FAT12/16 的定义相同,只不过两者位于启动扇区不同的位置而已。
0x41~0x41:1字节,与FAT12/16 的定义相同,只不过两者位于启动扇区不同的位置而已 。
0x42~0x42:1字节,扩展引导标志,0x29。与FAT12/16 的定义相同,只不过两者位于启动扇区不同的位置而已
0x43~0x46:4字节,卷序列号。通常为一个随机值。
0x47~0x51:11字节,卷标(ASCII码),如果建立文件系统的时候指定了卷标,会保存在此。
0x52~0x59:8字节,文件系统格式的ASCII码,FAT32。
0x5A~0x1FD:共410字节,引导代码。
0x1FE~0x1FF:签名标志“55 AA”。 

2、FSINFO扇区

        FAT32在保留区中增加了一个FSINFO扇区,用以记录文件系统中空闲簇的数量以及下一可用簇的簇号等信息,以供操作系统作为参考。FSINFO信息扇区一般位于文件系统的1号扇区,结构非常简单。

0x200~0x203:4个字节,扩展引导标志“52 52  61  41”。
0x204~0x3E3:480个字节,未使用,全部置0。
0x3E4~0x3E7:4个字节,FSINFO签名“72  72  41  61”。
0x3E8~0x3EB:4个字节,文件系统的空簇数,FF  FF  FF  FF,这个值感觉有问题,格式化SD卡新建一个小于4K的文件,此处的值变成1C  F6  FE,所以上面的值应该为0x1FF6FF,猜测可能是由于格式化之后就会将此处置FF,新建文件后才会恢复。
0x3EC~0x3EF:4个字节,下一可用簇号(0x00000002)。
0x3F0~0x3FD:14个字节,未使用。
0x3FE~0x3FF:2个字节,“55 AA”标志。 
温馨提示:通常情况下,文件系统的2号扇区结尾也会被设置“55 AA”标志。6号扇区也会有一个引导扇区的备份,相应的7号扇区应该是一个备份FSINFO信息扇区,8号扇区可以看做是2号扇区的备份。

2、FAT1:FAT的含义是文件分配表,FAT32一般有两份FAT,FAT1是第一份,也是主FAT。

      FAT2:FAT2是FAT32的第二份文件分配表,也是FAT1的备份,跟在FAT1的后面。

        文件系统用簇作为基本单位来存放文件的数据。对于小文件,只需要用到一个簇来保存文件的所有数据。对于大文件,就需要分配多个簇,存放同一个文件的簇不一定连续,这就需要把簇的前后关系用FAT表来存放表示。

        与FAT16类似,FAT32用32bit来描述一个簇。第0、1、2、3个字节表示第0个簇,第4、5、6、7个字节表示第1个簇,第8、9、10、11个字节表示第2个簇…就这样,每个簇都有4个和它对应的字节,这4个字节里面存放的数据就是文件中下一个簇大小数据所在的簇号。
        比如要读new.txt文件,从根目录中找到了它,读它的根目录信息知道它的第一个簇的簇号是5,于是把第5号簇的数据送出去,在FAT表中5号簇是第20、21、22、23字节来表示的,于是去读第20、21、22、23字节,得到00000007,知道了文件接下来的数据保存在7号簇中,把7号簇的数据送出去,又去读第28、29、30、31字节的数据,得到FFFFFFFF,说明文件到末尾了。

3、根目录和数据区:

        根目录就是保存盘中有哪些文件,该文件相关信息的地方。用32字节表示一个对象。当从文件系统中读文件的时候,比如读TEST.txt文件就是先在根目录中找到该文件,然后读它的信息,得到它的起始簇号,接着把起始簇号的数据送出去,然后去FAT表得到接下来数据保存的簇号,把对于数据送出去,一直到结束。

0x00-0x07:文件名,不足8个字节0x20补全(短文件名8.3命名规则)
0x08-0x0A:扩展名
0x0B:文件属性,0x20表示归档
0x0D:创建时间的10毫秒位
0x0E-0x0F:文件创建时间
0x10-0x11:文件创建日期
0x12-0x13:文件最后访问日期
0x14-0x15:文件起始簇号的高16位 0x0000
0x16-0x17:文件最近修改时间
0x18-0x19:文件最近修改日期
0x1A-0x1B:文件起始簇号的低16位 0x0003
0x1C-0x1F:文件的长度,0x2206=8710bytes=8.5K 

 

 


推荐阅读
  • 转自:http:www.phpweblog.netfuyongjiearchive200903116374.html一直对字符的各种编码方式懵懵懂懂,什 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • MATLAB函数重名问题解决方法及数据导入导出操作详解
    本文介绍了解决MATLAB函数重名的方法,并详细讲解了数据导入和导出的操作。包括使用菜单导入数据、在工作区直接新建变量、粘贴数据到.m文件或.txt文件并用load命令调用、使用save命令导出数据等方法。同时还介绍了使用dlmread函数调用数据的方法。通过本文的内容,读者可以更好地处理MATLAB中的函数重名问题,并掌握数据导入导出的各种操作。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • 1关于字符串相邻的两个或多个字符串字面值(引号引起来的字符)将会自动连接到一起:str_catpython!str_cat输出:python!把很长 ... [详细]
  • java io换行符_Java IO:为什么从stdin读取时,换行符的数字表示出现在控制台上?...
    只是为了更好地理解我在讲座中听到的内容(关于Java输入和输出流),我自己做了这个小程序:publicstaticvoidmain(String[]args)thro ... [详细]
  • 深入理解计算机系统之链接(一)
    程序是怎样运行的写好的c程序怎样运行的呢?答案是一个写好的程序要先经过语言预处理器,编译器,汇编器和链接器生成最后的可执行文件,然后加载器将可执行文件加载到内存中才能运行。这里以一 ... [详细]
  • c语言 怎么访问64位地址_C语言调动硬件的原理是什么?
    大家都知道我们可以使用C语言写一段程序来控制硬件工作,但你知道其工作原理吗?1c语言在实际运行中,都是以汇编指令的方式运行的,由编译器把C ... [详细]
  • LINUX运行谷歌TTS,中文TTS 的简单实现(基于linux)之 语音库的实现
    语音库保存着常用汉字的发音(多音的汉字只记录其一种发音,这也是本系统的一个缺陷,需要以后完善),所以先要得到一汉字集,这个汉 ... [详细]
  • 我举个例子,C代码如下:#include<stdio.h>main(){charx;printf(本程序功能:任意输入一个字符,如果是字母字符,将其ASCII ... [详细]
author-avatar
张嫱的小屋_133
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有