FAT32文件系统的存储组织结构(一)
对磁盘的物理结构,逻辑结构和存储结构有了比较深入的了解后,我们来仔细探讨FAT32文件系统的存储组织结构。说到文件系统的组织结构,我们应该马上意识到,这指的是文件系统在同一个分区内的组织结构,在这个话题上,我们完全可以不管分区之外的所有事情。
为了分析FAT32文件系统的存储组织结构,我们来建立一个实实在在的文件系统:将U盘插入电脑,将U盘格式化成FAT32分区格式:
以建好的U盘FAT32文件系统为基础,下面从文件系统的各个组成来分别加以介绍。
分区引导扇区DBR
用winhex打开U盘显示如下:
这是FAT32分区引导记录 ,定义如下:
偏移00H: 3字节的 跳转指令 EB 58 90,跳过下面的BPB和扩展BPB部分
偏移03H:8字节的硬盘分区类型文本字符名:4D 53 44 4F 53 35 2E 30 即: MSDOS5.0
偏移0BH: 25字节的分区参数块(BPB),细分如下:
偏移0BH:扇区字节数 00 02 即0X0200,512字节
偏移0DH:每簇扇区数 08即每簇包括8个扇区
偏移0EH:保留扇区数 24 00即保留36个扇区
偏移10H:FAT表份数 02即两个FAT表
偏移11H:未用 00 00
偏移13H:未用 00 00
偏移15H:介质类型 F8即本地硬盘
偏移16H:未用 00 00
偏移18H:每磁道扇区数 3F 00 即每磁道63扇区
偏移1AH:磁头数 FF 00即255个磁头
偏移1CH:隐藏扇区数 80 1F即8064个隐藏扇区
偏移20H:磁盘总扇区数 80 F0 77 00即总共7860352个扇区(7860352*512=4024500224,因为我的U盘是4G)
偏移24H:52字节的扩展分区参数块(扩展BPB),细分如下:
偏移24H:FAT表占用扇区数 EE 1D 00 00即FAT表占7662个扇区
偏移28H:未用 00 00 00 00
偏移2CH:根目录入口簇号 02 00 00 00即根目录从02号簇开始
偏移30H:文件系统信息扇区号 01 00即扇区1
偏移32H:备份引导扇区的位置 06 00即6号扇区(第7个扇区),从WINHEX中我们也可以看到,6号扇区的内容和0号引导扇区内容 是 一样的
偏移34H:未用 00 00 00 00 00 00 00 00 00 00 00 00
偏移40H:物理磁盘号 00
偏移41H:未用 00
偏移42H:扩展引导标志 29即0X29
偏移43H:磁盘序列号F1 2A 27 04通常为一随机数
偏移47H:卷标ASCII 4E 4F 20 4E 41 4D 45 20 20 20 20 即NO NAME
偏移52H:文件系统格式ASCII 46 41 54 33 32 20 20 20即FAT32
偏移5AH:分区引导代码 420字节:
33C98ED1BCF47B8EC18ED9BD007C884E028A5640B408CD137305B9FFFF8AF166
0FB6C640660FB6D180E23FF7E286CDC0ED0641660FB7C966F7E1668946F8837E1
6007538837E2A007732668B461C6683C00CBB0080B90100E82B00E94803A0FA7DB
47D8BF0AC84C074173CFF7409B40EBB0700CD10EBEEA0FB7DEBE5A0F97DEBE0
98CD16CD196660663B46F80F824A00666A0066500653666810000100807E02000F8
52000B441BBAA558A5640CD130F821C0081FB55AA0F851400F6C1010F840D00FE4
602B4428A56408BF4CD13B0F96658665866586658EB2A6633D2660FB74E1866F7F1
FEC28ACA668BD066C1EA10F7761A86D68A56408AE8C0E4060ACCB80102CD13666
10F8254FF81C300026640490F8571FFC34E544C445220202020202000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000
00000000000000D0A52656D6F7665206469736B73206F72206F74686572206D656469
612EFF0D0A4469736B206572726F72FF0D0A507265737320616E79206B657920746F2
0726573746172740D0A0000000000ACCBD80000
偏移1FEH:有效扇区结束标志 55 AA
到此分区引导扇区介绍结束。
文件分配表FAT
简介:
FAT表(文件分配表),是FAT文件系统中用于磁盘数据索引和定位而引进的一种链式结构。在FAT文件系统中,文件的存储依照FAT表制定的簇链式数据结构来进行。同时,FAT文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。
FAT1表位置的定位:
在我们前面介绍分区引导记录的时候提到,在偏移0EH处存储了保留扇区的个数,这个保留扇区数指的就是当前分区内DBR到FAT表之间的所有扇区的个数(包括DBR但不包括FAT表)。因此,我们可以定位FAT表所在的起始偏移位置了,即24H*200H=4800H。我们贴出4800H处得部分内容如下:
显然没有错,这就是我们FAT1所存储的位置,只是当前没有存储文件,所以FAT比较简单罢了。
FAT2表位置的定位:
在我们前面介绍分区引导记录的时候提到,在偏移24H处存储了FAT表所占用的扇区个数,我们又知道FAT2是紧邻FAT1的,所以可以很容易得到FAT2的存储位置的偏移地址:FAT1的起始偏移地址+FAT1的大小=4800H+1DEEH*200H=3C2400H,我们贴出3C2400H处的部分内容如下:
显然没有错,这就是我们FAT2所存储的位置,内容与FAT1相同。
FAT表的特性:
FAT表由一系列大小相等的FAT表项组成,它有如下特性:
FAT32中每个簇的簇地址,使用32bit(4个字节)记录在FAT表中。FAT表中的所有字节位置以4个字节为单位进行划分,并对所有划分后的位置由0进行地址编号。0 号地址与1号地址被系统保留并存储特殊标志内容。从2号地址开始,每个地址对应于数据区的簇号,FAT表中的地址编号与数据区中的簇号相同。我们称FAT中的这些地址为FAT表项,FAT表项中记录的值称为FAT表项值。
当文件系统被创建,也就是进行格式化操作时,分配给FAT区域的空间将会被清空,在FAT1与FAT2的0号表项与1号表项写入特定值。由于创建文件系统的同时也会创建根目录,也就是为根目录分配了一个簇空间,通常为2号簇,所以2号簇所对应的2号FAT表项也会被写入一个结束标记。
如果某个簇未被分配使用,它所对应的FAT表项内的FAT表项值即用0进行填充,表示该FAT表项所对应的簇未分配使用。
当某个簇已被分配使用时,则它对应的FAT表项值也就是该文件的下一个存储位置的簇号。如果该文件结束于该簇,则在它的FAT表项中记录的是一个文件结束标记,对于FAT32而言,代表文件结束的FAT表项值为0x0FFFFFFF。
如果某个簇存在坏扇区,则整个簇会用FAT表项值0x0FFFFFF7标记为坏簇,不再使用,这个坏簇标记就记录在它所对应的FAT表项中。
由于簇号起始于2,所以FAT表的0号表项与1号表项不与任何簇对应。FAT32的0号表项值总是“F8FFFF0F”。1号表项可能被用于记录脏标志,以说明文件系统没有被正常卸载或者磁盘表面存在错误。不过此值似乎并不重要,因此我们只要了解就可以。正常情况下,1号表项值为“FFFFFFFF”或“FFFFFF0F"。
在文件系统中新建文件时,如果新建的文件只占用一个簇,为其分配的簇所对应的FAT表项将会被写入结束标记。如果新建的文件不只占用一个簇,则在其所占用的每个簇对应的FAT表项中写入为其分配的下一簇的簇号,在最后一个簇对应的FAT表项中写入结束标记。
新建目录时,只为其分配一个簇的空间,对应的FAT表项中写入结束标记。当目录增大超出一个簇的大小时,将会在空闲空间中继续为其分配一个簇,并在FAT表中为其建立FAT表链以描述它所占用的簇情况。
对文件或目录进行删除操作时,它们所对应的FAT表项将会被清空,设置为0以表示其所对应的簇处于未分配状态。
根目录区
简介:
在FAT32文件系统中,根目录的位置不再硬性地固定,可以存储在分区内可寻址的任意簇内,不过通常根目录是最早建立的(格式化就生成了)目录表。所以,我们看到的情况基本上都是根目录首簇紧邻FAT2,占簇区顺序上的第1个簇(即2号簇)。同时,FAT32文件系统将根目录当做普通的数据文件来看,所有没有了目录项数的限制,在需要的时候可以分配空簇,存储更多的目录项。
起始偏移地址定位:
根目录起始扇区=保留扇区数+FAT×2+(起始簇-2)x每簇的扇区数,在我们前面介绍分区引导记录的时候提到,偏移2CH处保存了根目录起始簇号是2,所以求得根目录起始扇区是24H+1DEEH*2H+(2-2)*8H=3C00H,即求得偏移地址3C00H*200H=780000H,我们贴出780000H处的部分内容如下:
目录区的一个目录项占用32个字节,可以是长文件名目录项、文件目录项、子目录项等。
短文件名格式的目录项
对于短文件名格式的目录项。其参数意义如下:
根据参数定义,我们来分析一下上图的目录项 54 45 53 54 5F 46 41 54 33 32 20 08 00 00 00 00 00 00 00 00 00 00 19 95 10 3F 00 00 00 00 00 00。其中起始11字节54 45 53 54 5F 46 41 54 33 32 20 是卷标TEST_FAT32;第12字节08指示当前目录项保存的是卷标;第23-24字节19 95即9519H,是最近修改时间:19点40分50秒;第25-26字节10 3F即3F10H,是最近修改日期:2011年8月16日;
长文件名格式的目录项
FAT32的一个重要的特点是完全支持长文件名。长文件名依然是记录在目录项中的。为了低版本的OS或程序能正确读取长文件名文件,系统自动为所有长文件名文件创建了一个对应的短文件名,使对应数据既可以用长文件名寻址,也可以用短文件名寻址。不支持长文件名的OS或程序会忽略它认为不合法的长文件名字段,而支持长文件名的OS或程序则会以长文件名为显式项来记录和编辑,并隐藏起短文件名。
当创建一个长文件名文件时,系统会自动加上对应的短文件名,其原则如下:
(1)、取长文件名的前6个字符加上"~1"形成短文件名,扩展名不变。
(2)、如果已存在这个文件名,则符号"~"后的数字递增,直到5。
长文件名的实现有赖于目录项第12字节属性字节,当此字节的值为0FH时,支持长文件名的系统会将其当做长文件名的依据,而只支持短文件名的系统会认为是异常而忽略掉。系统将长文件名以13个字符为单位进行切割,每一组占据一个目录项。所以可能一个文件需要多个目录项,这时长文件名的各个目录项按倒序排列在目录表中,以防与其他文件名混淆。
长文件名中的字符采用unicode形式编码,每个字符占据2字节的空间。其目录项定义如:
下面是我建立的长文件名文件夹abcdefghijklmnopqrstuvwxyz1234567890的目录项:
FAT32文件系统的存储组织结构(一)的更多相关文章
- FAT32文件系统的存储组织结构(二)
前面已经基于一个格式化的空U盘分析了一下FAT32文件系统存储的组织结构,下面我们从文件操作的角度来分析一下文件系统的运作机制.由于换了个U盘,所以仍然贴出刚格式化的空U盘的几个重要的数据区如下: ...
- FAT32文件系统学习(3) —— 数据区(DATA区)
FAT32文件系统学习(3) —— 数据区(DATA区) 今天继续学习FAT32文件系统的数据区部分(Data区).其实这一篇应该是最有意思的,我们可以通过在U盘内放入一些文件,然后在程序中读取出来: ...
- FAT32文件系统学习(2) —— FAT表
1.题外话 在继续本文学习FAT32文件系统之前,先来插入一点别的话题.我们都知道U盘有一个属性是容量,就拿笔者的U盘为例,笔者手上的U盘是金士顿的DataTraveler G3 4GB的一个U盘.电 ...
- U盘FAT32文件系统
一.FAT文件系统分为四个部分 参考别人的博客 1.http://blog.163.com/ourhappines@126/blog/static/121363154201311811495492/ ...
- FAT32文件系统--For TF卡
1. TF卡空间是如何分配的? 下面以4GB TF卡为例,通过WinHex工具进行分析,其空间分配如下图所示: FAT32把目录当做文件来管理,所以没有独立的目录区,所有的文件目录项都是在数据区里面的 ...
- SD卡FAT32文件系统格式
一.声明 1.本文来源和主旨 2.本文测试环境 二.SD卡FAT文件系统 1.SD卡FAT32文件系统的整体布局 2.FAT文件系统简介 ① 文件分配表 ② 目录项 三.DBR(DOS BOOT RE ...
- 移动存储卡仍然用FAT32文件系统的真相
微软在2001年就为自家的XP系统的本地磁盘默认使用了NTFS文件系统,但是12年之后,市面上的USB可移动设备和SD卡等外置存储器仍然在用着FAT32文件格式,这是什么理由让硬件厂商选择过时的文件系 ...
- FAT32文件系统学习(上)
2011-06-02 22:30:48 目的:需要编写SD读图片的底层驱动程序.所以要了解一个SD卡常用文件系统基本概念.累计学习用时2.5小时. 一,FAT32的保留区 1,引导扇区 :引导扇区是F ...
- 【转载】FAT32文件系统详解
硬盘是用来存储数据的,为了使用和管理方便,这些数据以文件的形式存储在硬盘上.任何操作系统都有自己的文件管理系统,不同的文件系统又有各自不同的逻辑组织方式.例如:常见的文件系统有FAT,NTFS,EXT ...
随机推荐
- apache配置详解
可参考:Apache 的 httpd.conf 详解 ServerTokens OS 此指令控制了Server回送给客户端的回应头域是否包含关于服务器OS类型和编译进的模块描述信息.服务器会发送:Se ...
- BZOJ 4516: [Sdoi2016]生成魔咒 [后缀自动机]
4516: [Sdoi2016]生成魔咒 题意:询问一个字符串每个前缀有多少不同的子串 做了一下SDOI2016R1D2,题好水啊随便AK 强行开map上SAM 每个状态的贡献就是\(Max(s)-M ...
- poj1265&&2954 [皮克定理 格点多边形]【学习笔记】
Q:皮克定理这种一句话的东西为什么还要写学习笔记啊? A:多好玩啊... PS:除了蓝色字体之外都是废话啊... Part I 1.顶点全在格点上的多边形叫做格点多边形(坐标全是整数) 2.维基百科 ...
- java递归
package com.sun.test; import java.util.ArrayList; import java.util.List; /** * 递归 * */ public class ...
- “茴”字有四种写法,this也是一样
说到这个地方又想起以前高中还是初中学的<孔乙己>这个梗,但是这里的this显然实用性比那个要大很多,哈哈. 简单来说,this有四种应用场景,分别是在构造函数上.对象属性中.普通函数中.c ...
- Go解析写死的json
func TestAliAfpAdapter_AskAd_Banner(t *testing.T) { apiData := getApiData() apiData.ApiInfo.ApiPosit ...
- iOS "此证书由未知颁发机构签名"此问题的解决方法
前段时间制作证书时把以前钥匙串中的证书全删除了,然后在制作新证书的时候就出现了"此证书由未知颁发机构签名"的红色警告,通过查找资料发现出现此问题的原因是:我把钥匙串中的此证书给删除 ...
- Centos7新功能
Centos7 单用户模式 centos7里不再有0-6启动级别,而是4个target graphical.target 多人模式,支持图形和命令行两种登录,对应之前的3,5级别 mul ...
- Vijos 1404 遭遇战
Vijos 1404 遭遇战 背景 你知道吗,SQ Class的人都很喜欢打CS.(不知道CS是什么的人不用参加这次比赛). 描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分子要炸掉藏在A区 ...
- Python基础——条件判断
Python版本:3.6.2 操作系统:Windows 作者:SmallWZQ 到目前为止,Python基础系列的文章中的程序都是一条一条语句顺序执行的.在本章中,我会重点介绍让程序选择是否执行语 ...