FAT12文件系统 理解

这篇具有很好参考价值的文章主要介绍了FAT12文件系统 理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

标准

从需求出发

FAT(FAT12)

保留扇区Boot Sector & BPB

BPB信息的使用

BootSector&BPB地址

首地址:0x0000

末地址:0x0000+0x0200-1 = 0x01FF

计算FAT位置

FAT[0]起始地址:0x0200

FAT[0]末地址=0x13FF

FAT[1]首地址=0x1400

FAT[0]末地址=0x25FF

计算根目录区的扇区数RootDirSectors

数据区Data Region

DataRegion的首地址:0x4200

 文件(文件夹)的存放

DirEntry中标记有Cluster编号与DataRegion对应

测试的重点备注

FAT数据结构

LBA到CHS

FAT类型的确认 

题外话:

FAT数据结构后端是有空白的

为什么是FAT12


FAT文件系统用在(DOS) windows环境下用的比较多。最近好奇,查一下资料,做一下笔记。

标准

FAT文件系统应该是有一本规范的,零星找来找去,走了不少弯路才找到。以下是文档的版本。(以下简称白皮书)

Microsoft Extensible Firmware Initiative
FAT32 File System Specification
FAT: General Overview of On-Disk Format

Version 1.03, December 6, 2000
Microsoft Corporation

此文描述中不清楚或是谬误之处还是要参照标准。

备注:

按白皮书所讲,FAT12微软只用在软盘上。

从需求出发

以档案馆作为例子来看,要存放的文件就是档案,存放的位置就是档案柜。文件存入档案馆后为了方便查找,我们通常会做一个目录或是索引,索引中至少需要有文件名和存放位置,大致如下。

FAT12文件系统 理解

如果来了一份档案,内容很多,一个位置放不下,可以如下方式存放(暂时ok)。

FAT12文件系统 理解

这份档案后期又有新的内容补充,

FAT12文件系统 理解

但这份档案越来越多后,文件在索引中和物理位置上都不连续,查收起来会有麻烦,而且比较容易遗漏,比如没有看到“文件名5-4”。可以如下:

FAT12文件系统 理解

这样也是可以的,但每次有新档案加入,就需改写一遍之前的,也不太好。

另外,档案多了以后,我们也不容易知道哪个些位置是空的,哪些位置是满的,如何改善呢?

FAT的方式是,另外做一个索引或表,用来标记位置的使用情况,

 FAT12文件系统 理解

 这样,哪些位置是空的,哪些是满的,就一目了然了,新来的档案也比较容易找到哪个位置够大。

结合这个“位置表”和文件-位置索引表,位置表中的状态信息做一下补充(除了满、空之外,再补充一下,文件的结束,及如果没结束,剩下的部分的位置号),对于“文件名5”的存放以有另外一个方式,如下

FAT12文件系统 理解

这就是FAT的方式。(这样对于“文件5”的存放比较方便,但查阅就有些不方便了,但计算机速度快,还好) 

FAT(FAT12)

如白皮书所讲:

The FAT (File Allocation Table) file system has its origins in the late 1970s and early1980s
and was the file system supported by the Microsoft® MS-DOS® operating system. It was
originally developed as a simple file system suitable for floppy disk drives less than 500K in
size. Over time it has been enhanced to support larger and larger media. Currently there arethree FAT file system types: FAT12, FAT16 and FAT32.

FAT文件系统在1970年代末1980年代初,设计用来给小于500K的软盘使用,慢慢被用来支持越来越大的存储介质,现在有FAT12、FAT16、FAT32三种。

上文中的“位置表”就是FAT(File Allocate Table),“索引表”对应根目录区(Root Directory Region)。再加上真正存放档案的位置(DataRegion),结构如下

FAT12文件系统 理解

由于FAT很重要,所以在FAT可以有备份,在FAT12中一般是有一个备份。然后就是下面的样子。

FAT12文件系统 理解从计算机发展看,是新的计算机,后有磁盘(在磁盘发明前,前面还有其它的方式来存储信息),所谓的“计算机文件系统”是在计算机+磁盘的使用过程中诞生(在电脑上实现人脑中的想法,或是将系统由其它介质(如纸)移植到电脑),后又强化或方便了磁盘的使用的。

在“计算机文件系统”发明前,文件系统的概念一定时存的,如同我们上面的图表,只是不存在于电脑中,而是存于人脑中,记录在纸或其它介质上。

而计算机(很多东西也一样),需要具备向后的兼容性,所以也是一点点由小到大,由少到多的积过程。也正因如此,从小的、简陋的开始了解,往往看似难,实则更容易找到本源,更容易理解后期的成品。

在FAT_0前面还有一个保留区域,猜测是兼容的原因。所以完整的FAT系统如下:

FAT12文件系统 理解

 下面我们一起来一点一点的分解(以FAT12为例,也是最小的FAT文件系统)。

分解前,首先明确几个数据的组织单位。

  1. 数据的最小单位是bit(比特),
  2. 8bit (比特)= Byte(字节),
  3. 512Byte(字节)=1Sector(扇区)(不一定都是,但对软盘来是的)
  4. 2^nSector(扇区)=1Cluster(簇)(可能叫作“集群”更合适。怀疑这个概念是在后期FAT版本中加入的。在FAT12中 n=0,即1Sector = 1Cluster)

Sector(扇区)是机械磁盘的引入的。暂时我们磁盘抽象成一个地址连续的线性空间就好。(这也就是Logical Block Address)其中,bit、Byte、Sector都从0开始计数。

保留扇区Boot Sector & BPB

这个扇区很重要,内部记录了很多系统访问需要的基本信息,主要分为BootSector相关的,后续以"BS_"开头,和与BPB (Bios Parameter Block)相关的,以“BPB_”开头。(Bios = Basic Input & Output System,基本输入输出系统)结构如下。

FAT12文件系统 理解

白皮书中有如下描述:

The first important data structure on a FAT volume is called the BPB (BIOS Parameter Block), which is located in the first sector of the volume in the Reserved Region. This sector is sometimes called the “boot sector” or the “reserved sector” or the “0th sector,” but the important fact is simply that it is the first sector of the volume.
This is the first thing about the FAT file system that sometimes causes confusion. In MS-DOS version 1.x, there was not a BPB in the boot sector. In this first version of the FAT file system, there were only two different formats, the one for single-sided and the one for double-sided 360K 5.25-inch floppy disks. The determination of which type was on the disk was done by looking at the first byte of the FAT (the low 8 bits of FAT[0]).
This type of media determination was superseded in MS-DOS version 2.x by putting a BPB in the boot sector, and the old style of media determination (done by looking at the first byte of the FAT) was no longer supported. All FAT volumes must have a BPB in the boot sector.

几点:

  1. 在MS-DOS1.x时代,FAT的保留扇区(Sector 0 )中是没有BPB信息的
  2. BPB信息是在MS-DOS2.x中加入的
  3. FAT[0]中的低8位,被历史原因占用了

##测试记录

在Win XP Pro Sp3 CN下没有BPB的软盘是不被识别的,认为是未被格式化的。

(在虚拟机中测试的;

  1. 加载一个空的软盘映像
  2. 用Win XP Pro Sp3 CN格式化,放入几个测试文件,退出映像
  3. 用16进制编辑器,清除掉BPB信息,再加载)

此部分的总体结构是这样的,开头是固定长度的代码,3byte长,通常是Jmp指令,借此跳过BPB,执行后续代码。

如果是Jmp指令不足3Byte,用0x90 (空指令补全,实际是什么应该不重要)

 0xAA55的标记(据说是对应电路中的方波,最容易检测的),是此扇区中有启动代码的标记。(不论这个Sector是否有启有信息,BPB的位置固定的,固定是重要的,地址固定了,也就可以寻址了)

BPB和BS代码部分如下(FAT12\FAT16的,FAT32的后半部分不同):

;	名称									10进制偏移地址 16进制偏移		说明	
;												长度		结束地址
;	BS_jmpBOOT:			jmp Entry			;	0_3byte		0x00-0x02	跳转指令	
;						db 0x90				;	
	BS_OEMName:			DB	'MSDOS5.0'		;	3_8byte		0x03-0x0a	OEM厂商名	
	BPB_BytesPerSec:	dw	0x200			;	11_2		0x0b-0x0c	每扇区字节数(Bytes/Sector)	
	BPB_SecPerClus:		db	0x01			;	13_1		0x0d		每簇扇区数(Sectors/Cluster)	
	BPB_ResvdSecCnt:	dw	0x0001			;	14_2		0x0e-ox0f	Boot记录占用多少扇	
	BPB_NumFATs:		DB	0x02			;	16_1		0x10		共有多少个FAT表	
	BPB_RootEntCnt:		dw	0xE0			;	17_2		0x11-0x12	根目录区文件最大数	
	BPB_TotSec16:		dw	0x0B40			;	19_2		0x13-0x14	扇区总数=80x2x18=2880	
	BPB_Media:			db	0xF0			;	21_1		0x15		介质描述符	
	BPB_FATSz16:		dw	0x0009			;	22_2		0x16-0x17	每个FAT表所占扇区数	
	BPB_SecPerTrk:		DW	0X0012			;	24_2		0x18-0x19	每个磁道扇数(Sector/track)	
	BPB_NumHeads:		dw	0x0002			;	26_2		0x1a-0x1b	磁头数(面数)				
	BPB_HiddSec:		dd	0x0000_0000		;	28_4		0x1c-0x1f	隐藏扇区数					
	BPB_TotSec32:		dd	0x0000_0000		;	32_4		0x20-0x23	如果BPB_TotSec16=0,则上此处给出扇区数	
	BS_DrvNum:			db	0x00			;	36_1		0x24		Int 13H的驱动器号	
	BS_Reserved1:		db	0x00			;	37_1		0x25		保留,未使用	
	BS_BootSig:			db	0x29			;	38_1		0x26		扩展引导标记(29H),用于指明此后的三个域可用	
	BS_VolID:			dd	0x0000			;	39_4		0x27-0x2a	卷序列号	
	BS_VolLab:			DB	'NO_NAME    '	;	43_11		0x2b-0x35	卷标	
	BS_FileSysType:		db	'FAT12   '		;	54_8		0x36-0x3d	文件系统类型	
;	引导代码及其它内容						;	62至448					引导代码及其它内容
;	dw	0xAA55								;	510_2				用于引导的结束标志

以下是个Win XP Pro SP3下格式非DOS启动软盘的分析截图。FAT12文件系统 理解

BPB信息的使用

BootSector&BPB地址

首地址:0x0000

长度=BPB_ResvdSecCn * BPB_BytsPerSec=1*512 (通常)=512 =0x0200

末地址:0x0000+0x0200-1 = 0x01FF

计算FAT位置

FAT[0]起始地址:0x0200

FAT[0]长度 = FAT 结构的扇区数*BPB_BytsPerSec * BPB_BytsPerSec

               FAT 结构的扇区数(FATSz)的确认,对于软盘3.5”,1.44M:为9x512= 0x1200

if(BPB_FATSz16 != 0)
    FATSz = BPB_FATSz16;
else
    FATSz = BPB_FATSz32;

FAT[0]末地址=0x13FF

FAT[1]首地址=0x1400

FAT[1]长度 = FAT[0]长度 = 0x1200

FAT[0]末地址=0x25FF

计算根目录区的扇区数RootDirSectors

RootDirSectors首地址=0x2600

主目录区的样子如下图

FAT12文件系统 理解

自然,RootDirSectors(根目录占用扇区数)FAT12文件系统 理解

 向上圆整可以替换为

FAT12文件系统 理解

FAT12文件系统 理解

每个条目的字节数固定为32byte

FAT12文件系统 理解

占用字节数:=14x512=7168 = 0x1C00 

RootDirSectors末地址=0x41FF

数据区Data Region

DataRegion的首地址:0x4200

到此为止,各个大区域的地址都确认到了,FAT(12)的样子如下:

FAT12文件系统 理解

 文件(文件夹)的存放

接下来就是文件(文件夹的存放)

  1. 在根目录中找一个空闲区域
  2. 到FAT数据结构(FAT-FileAllocateTable本名就是表,不便称为FAT表)中找一个空闲数据区域(Cluster)
  3. 将以上两项的信息合并,作为一个条目(Entry)写入根目录区,在FAT中标记此Cluster占用。

在根目录中建立的条目(Entry)称作:Directory Entry,结构如下:

	DIR_Name:	times 11 db 	;0	0x00-0x0a	11字节,8.3文件名
	DIR_Attr:	db				;11	0x0b-		是一个 位给合
	DIR_NTRes:	db				;12	0x0c-		为WIN NT保留
	DIR_CrtTimeTenth:	db		;13	0x0d-		创建时间100ms精度
	DIR_CrtTime:	dw			;14	0x0e-0x0f	创建时间
	DIR_CrtDate:	dw			;16	0x10-0x11	创建日期
	DIR_LstAccDate:	dw			;18	0x12-0x13	最后访问日期
	DIR_FstClusHI:	dw			;20	0x14-0x15	首cluster编号的高word
	DIR_WrtTime:	dw			;22	0x16-0x17	写时间	
	DIR_WrtDate:	dw			;24	0x18-0x19写日期
	DIR_FstClusLO:	dw			;26	0x1a-0x1b	首Cluster编号的低word
	DIR_FileSize:	dd			;28	0x1c-0x1f	文件大小

测试:

  1. 新建一个软盘映像
  2. 用虚拟机中的Win XP Pro SP3(下同)格式化,
  3. 并依次写入文件
    1. A1A2AEA4.txt        内容为重复的字母"a",长度小于512byte;
    2. B1B2B3B4.txt        内容为重复的字母"b",长度小于512byte;
    3. C1C2C3C4.txt        内容为重复的字母"c",长度小于512byte;
    4. 文件夹:FOLD_A1A
    5. 在FOLD_A1A下写入文件  D1D2D3D4.TXT,内容为重复的字母"c",长度小于512byte;

目录结构及信息如下:

//目录结果
A:\>tree /f
文件夹 PATH 列表
卷序列号为 5008-EBA2
A:.
│  A1A2AEA4.txt
│  B1B2B3B4.txt
│  C1C2C3C4.txt
│
└─FOLD_A1A
        D1D2D3D4.TXT
//根目录下的文件&文件夹的详情
A:\>dir
 驱动器 A 中的卷没有标签。
 卷的序列号是 5008-EBA2

 A:\ 的目录

2022-12-25  15:54               217 A1A2AEA4.txt
2022-12-25  15:56               217 B1B2B3B4.txt
2022-12-25  15:56               217 C1C2C3C4.txt
2022-12-25  15:59    <DIR>          FOLD_A1A
               3 个文件            651 字节
               1 个目录      1,455,104 可用字节
//FOLD_A1A目录下的文件详情
A:\>dir FOLD_A1A
 驱动器 A 中的卷没有标签。
 卷的序列号是 5008-EBA2

 A:\FOLD_A1A 的目录

2022-12-25  15:59    <DIR>          .
2022-12-25  15:59    <DIR>          ..
2022-12-25  15:59               217 D1D2D3D4.TXT
               1 个文件            217 字节
               2 个目录      1,455,104 可用字节

得到的分析结果如下,与推算的一致在0x2600处,找到了三个文件和一个文件夹

FAT12文件系统 理解

各文件的数据区数据:

序号 文件名 首Cluster高word 首Cluster代word 首字Cluster编号 Cluster对应地址
1 A1A2A3A4.TXT   0X00 0x02 0x0002 0x4200
2 B1B2B3B4.TXT 0x00 0x03 0x0003 0x4400
3 C1C2C3C4.TXT 0x00 0x04 0x0004 0x4600
4 FOLD_A1A 0x00 0x05 0x0005      0x4800
5

在0x4200的位置找到了文件"A1A2A3A4.TXT"的内容,如下

FAT12文件系统 理解

FAT12文件系统 理解

FAT12文件系统 理解

紧接近在0x4800的位置,找到的文件夹“FOLD_A1A”的内容。(暂时是推)

FAT12文件系统 理解

按DirEntry的格式分析一下0x4800的数据,如下图:

发现这里有3个文件(Entry), 

再向下找,分在0x4A00的位置找到文件“D1D2D3D4.TXT”的内容,如下:

FAT12文件系统 理解

把两个表格合并到一起,把根目录的地址也填上,得到下表:

序号 文件名 首Cluster高word 首Cluster代word 首字Cluster编号 Cluster对应地址
0   根目录 NA NA NA 0x2600
1 A1A2A3A4.TXT   0X00 0x02 0x0002 0x4200
2 B1B2B3B4.TXT 0x00 0x03 0x0003 0x4400
3 C1C2C3C4.TXT 0x00 0x04 0x0004 0x4600
4 FOLD_A1A 0x00 0x05 0x0005      0x4800
5 . 0X00 0x05 0x0005 0x4800
6 .. 0x00 0x00 0x0000 0x4200
7 D1D2D3D4.TXT 0x00 0x06 0x0006 0x4A00

这样理论和实物就手工对上了。

FAT12文件系统 理解

DirEntry中标记有Cluster编号与DataRegion对应

很明显,DirEntry中给定的Cluster编号N,对应的LBA地址有如下规律: 0x4200 +(N-2)x 0x0200;

N=0x0000时,LBA = 0x2600 = RootDireSector的首地址

N<>0x0000时,LBA =  0x4200 +(N-2)x 0x0200 = DataRegionSector的首地址+(N-2)x BPB_BytsPerSec

在BPB_SecPerClus 现在刚好=1,可以推测在不等于1时,

LBA =  0x4200 +(N-2)x 0x0200 = DataRegionSector的首地址+(N-2)x BPB_BytsPerSec x BPB_SecPerClus

测试的重点备注

测试时有可能得不到上面的数据,而且看起来怪怪,原因:

1、用win xp 格式化软盘时,有一个“卷标”,如果选种了卷标,出现在0x2600的Entry就是“卷标”。

FAT12文件系统 理解

2、文件是在其它文件夹是建好,然后逐个移入的,如果我们在接在文夹或文件,直观的看起来,系统会在文件夹下放一下“新建文件夹”或是“新建 文本文档.txt”,而且处于改名状态。预计系统是分两步进行的:

        A、先在磁盘上完成了一个完整的“新建”动作;(我们用的是中文系统,此时写入的DirEntry中使用了中文文件名UTF-16,和长文件名两个后来补充内FAT(12)文件系统的功能),增加了复杂度;

        B、执行改名操作。文件改名的操作,并不是修改原来的DirEntry,而是将原来的标记为删除,并新插入了一条DirEntry,所以也会增加复杂度。

FAT12文件系统 理解

关于DIR_Name的基本描述,其它的都是扩展的(猜的):

DIR_Name[0]
Special notes about the first byte (DIR_Name[0]) of a FAT directory entry:
· If DIR_Name[0] == 0xE5, then the directory entry is free (there is no file or directory name in this
entry).
· If DIR_Name[0] == 0x00, then the directory entry is free (same as for 0xE5), and there are no
allocated directory entries after this one (all of the DIR_Name[0] bytes in all of the entries after
this one are also set to 0).

DIR_Name[0] == 0xE5,代表是写入后,又被删除的

DIR_Name[0] == 0 ,条目 是空的,很明显

FAT数据结构

下面来看一下FAT的数据结构,FAT的结构与前面以档案馆为例描述的一致,就是一个表状结构,里面装着每个cluster的状态信息。

FAT12文件系统 理解

FAT[0]        Reserved,== BPB_Media

FAT[1]        在格式化时被格式成EOC,== End Of Clusterchain,

另外FAT[1],在FAT16 和 FAT32中,除可以用于标记EOC外,还可以用来标记,指示需要进行磁盘检查(Chkdsk/Scandisk)

关于EOC:

Microsoft operating system FAT drivers use the EOC value 0x0FFF for FAT12, 0xFFFF for FAT16, and 0x0FFFFFFF for FAT32 when they set the contents of a cluster to the EOC mark. There are various disk utilities for Microsoft operating systems that use a different value, however.

即微软在白皮书中描述的作法是:

FAT12    EOC == 0xFFF(清单是3个F)

FAT16    EOC == 0xFFFF

FAT32    EOC == 0x0FFF_FFFF

但在白皮书的伪代码中的描述为:

IsEOF = FALSE;
If(FATType == FAT12) {
    If(FATContent >= 0x0FF8)
        IsEOF = TRUE;
} else if(FATType == FAT16) {
    If(FATContent >= 0xFFF8)
        IsEOF = TRUE;
} else if (FATType == FAT32) {
    If(FATContent >= 0x0FFFFFF8)
        IsEOF = TRUE;
}

另外,

There is also a special “BAD CLUSTER” mark. Any cluster that contains the  “BAD CLUSTER” value in its FAT entry is a cluster that should not be placed on the free list because it is prone to disk errors. The “BAD CLUSTER” value is 0x0FF7 for FAT12, 0xFFF7 for FAT16, and 0x0FFFFFF7 for FAT32. The other relevant note here is that these bad clusters are also lost clusters—clusters that appear to be allocated because they contain a non-zero value but which are not part of any files allocation chain. Disk repair utilities must recognize lost clusters that contain this special value as bad clusters and not change the content of the cluster entry. 

 FAT[x] 的值还可以为 BAD CLUSTER标记,

FAT12   BAD CLUSTER == 0xFF7

FAT16   BAD CLUSTER == 0xFFF7

FAT32   BAD CLUSTER == 0x0FFF_FFF7 

另外:

NOTE: It is not possible for the bad cluster mark to be an allocatable cluster number on FAT12 and FAT16 volumes, but it is feasible for 0x0FFFFFF7 to be an allocatable cluster number on FAT32 volumes. To avoid possible confusion by disk utilities, no FAT32 volume should ever be configured such that 0x0FFFFFF7 is an allocatable cluster number.

FAT32下真的存在一个编号为 BAD CLUSTER (0x0FFF_FFF7)的块,这这块要特别注意不要使用。

FAT12下,FAT[]的取值整理如下:

FAT[] 可取值 描术
0 BPB_Media 磁盘标识字,低字节需要与BPB_Mdeia数值一致
1 0xFFF 表示第一簇(Cluster)已占用(固定不变的)
2~N  0x000 可用Cluster
0x002~0xFEF 已经Cluster,具体最大值应该取决于最大Cluster值
>=0xFF8 EOF 文件结束
-------
0xFF7 坏Cluster

 FAT12数据结构中,每个Cluset用12bit表示,我们现在的样子如下:

FAT12文件系统 理解

我们将第一个文件A1A2AEA4.TXT的内容增加到>1K后(直接对比如下),(备注,文件名写错了)

 FAT12文件系统 理解

即如下图所示,按照1、2、4、5、6的顺序完成的文件内容的查找

FAT12文件系统 理解

文件的内容刚好如前面推算的,在0x4C00和 0x4E00的位置。

 FAT12文件系统 理解

LBA到CHS

 上面的地址地址偏移都是基于逻辑地址的,而实访问的磁盘是硬件相关的,比如软盘是按Cylider(柱面)、Head(磁头)、Sector(扇区)进行编号的。(似乎机械硬盘也是如些),这里需要有一下地址转换。

FAT12文件系统 理解

(图来自《30天手写操作系统》合秀实)

软盘有80个柱面x2磁头x18个扇区 = 2880个扇区。

柱面 从0开始编号,0-79

磁头 从0开始编号,0-1

扇区 从1开始编号,1-18(这个比较不一样) 

逻辑扇区

柱面

磁头

物理扇区

逻辑扇区0

0柱面

0磁头

1扇区

逻辑扇区1

0柱面

0磁头

2扇区

逻辑扇区2

0柱面

0磁头

3扇区

……

逻辑扇区17

0柱面

0磁头

18扇区

逻辑扇区18

0柱面

1磁头

1扇区

逻辑扇区19

0柱面

1磁头

2扇区

……

逻辑扇区35

0柱面

1磁头

18扇区

逻辑扇区36

1柱面

0磁头

1扇区

逻辑扇区37

1柱面

0磁头

2扇区

……          

 从最外层算起,计算柱面号,1个柱面有2个磁头,每个磁头的18个扇区,即36;

1、逻辑扇区号/36,商a余b,a即是物理柱面号,从0开始 (相当于36进制)

2、b/18,商c=0或1,余d,c即为磁头号,从0开始(相当于2进制)

3、d+1,即为物理扇区号,物理扇区从1开始计数

-----------或者少用一次除法

1、逻辑扇区/18,商a余b

2、a>>1,即是柱面号(右移于除2相当,所以还是除了36)

3、a&0x01,即最低一位,即磁头号

4、b+1,即是物理扇区号

FAT类型的确认 

BPB中有一个 BS_FileSysType,但这个不是判断该文件系统是FAT12或FAT16或FAT32的依据,按白皮书的讲法,此值只是参考。判断FAT文件类型的唯一标准是Cluster的数量。

It is really quite simple how this works. The FAT type—one of FAT12, FAT16, or FAT32—is determined by the count of clusters on the volume and nothing else. 

If(CountofClusters < 4085) { //注,4085 = 0xFF5
    /* Volume is FAT12 */
} else if(CountofClusters < 65525) { //注 65225 = 0xFEC9
    /* Volume is FAT16 */
} else {
    /* Volume is FAT32 */
}

另外,白皮书中讲,FAT12只用在软盘上。

Microsoft operating systems only do FAT12 on floppy disks. 

题外话:

FAT数据结构后端是有空白的

与我们用“本子”记录是一样的,本子后面通常会有空白,并不是刚刚好 

对于软盘而言,总的扇区数 = 80x2x18 = 2880个,
保留扇区 1个
FAT_0    9个
FAT_1    9个
根目录  = (0xE0 x32byte + 511)/512 = 14 个 
合计用掉了 1+9+9+14 = 33 个
剩余 2880-33 = 2847 = B1F 个扇区

为什么是FAT12

 1.44MB的软盘有2880个扇区,按照1扇区/cluster的规划,需要12位来记录,8位=1byte最大是是255;10位 = 1023;11位 2045;12位 = 0xFFF = 4095,刚好余了一点点儿。

---------FAT12的主线部分就理清,告一段落了。文章来源地址https://www.toymoban.com/news/detail-501418.html

到了这里,关于FAT12文件系统 理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 12. python从入门到精通——文件及目录操作

    目录 基本文件操作 创建和打开文件:open()函数 关闭文件:可以不关闭文件因为有垃圾回收功能 打开文件时使用with语句:不需要自己关闭文件,可以自己关闭 写入文件内容 file.write方法 file.writelines方法:可以向文件中写入字符串列表,但没有换行符和分隔符 读取文件有三种情况

    2024年02月09日
    浏览(53)
  • PostgreSQL 12 文档: 系统目录

    目录 51.1. 概述 51.2.  pg_aggregate 51.3.  pg_am 51.4.  pg_amop 51.5.  pg_amproc 51.6.  pg_attrdef 51.7.  pg_attribute 51.8.  pg_authid 51.9.  pg_auth_members 51.10.  pg_cast 51.11.  pg_class 51.12.  pg_collation 51.13.  pg_constraint 51.14.  pg_conversion 51.15.  pg_database 51.16.  pg_db_role_setting 51.17.  pg_default_acl 51.18.  pg_d

    2024年02月04日
    浏览(31)
  • Nginx目录结构简介:深入理解Nginx的默认文件和目录

    第一章 Nginx的默认目录结构 当你安装Nginx后,它的默认目录结构如下: 让我们逐个了解这些目录和文件的作用。 第二章 conf目录 conf目录包含了Nginx的配置文件,其中nginx.conf是Nginx主配置文件,它包含了所有全局的Nginx配置项。mime.types文件包含了MIME类型的定义,它告诉Nginx如

    2024年02月13日
    浏览(59)
  • 12 - Linux CentOS 7 文件和目录搜索(which、whereis、locate、find)

    ★ 功能:依据$PATH 环境变量中的目录路径,查找命令文件的文件路径。 ★ 举例: ★ 功能1:依据 P A T H 环境变量中的目录路径,查找命令文件的文件路径。★功能 2 :依据 PATH 环境变量中的目录路径,查找命令文件的文件路径。 ★ 功能2:依据 P A T H 环境变量中的目录路径

    2024年02月20日
    浏览(54)
  • 安卓12(高版本9+以上)安装Charles证书到系统证书安装目录

    (1) 安卓手机开启root并安装Magisk (2) 先安装Chalers证书到用户证书安装目录 (3) 下载并安装magisk的adguardcert模块 adguardcert模块下载:https://download.csdn.net/download/weixin_51111267/87929688 (4) 把刚刚安装到用户目录的证书 06c57dd5.0 移动到以下目录 /data/adb/modules/aguardcert/system/etc/security/cacert

    2024年01月17日
    浏览(54)
  • Linux文件系列: 深入理解缓冲区和C标准库的简单模拟实现

    至此,我们理解了缓冲区的概念和作用,下面我们来简易模拟实现一下C标准库 我们要实现的是: 1.文件结构体的定义 1.首先要有一个文件结构体: 刷新策略分别宏定义为 2.myfopen等等函数的声明 path:文件路径+文件名 mode:打开文件的方式 “r”:只读 “w”:覆盖写 “a”:追加写 strea

    2024年03月11日
    浏览(66)
  • flutter:文件系统目录、文件读写

    参考:老孟 文件存储和网络请求 Dart的 IO 库包含了文件读写的相关类,它属于 Dart 语法标准的一部分,所以通过 Dart IO 库,无论是 Dart VM 下的脚本还是 Flutter,都是通过 Dart IO 库来操作文件的。但是不同的平台对应的文件系统是不同的,比如文件路径,因此通常使用Google 官方

    2024年02月09日
    浏览(49)
  • Linux文件系统常见目录

    磁盘是用来存储文件的,但必须先把磁盘格式化为某种格式的文件系统,才能存储,而文件系统,就是用来组织和管理磁盘中文件的这样一种结构。Linux系统有着其独特的文件系统EXT2(演变出EXT3、EXT4,但核心不变),文件系统包括了文件的组织结构、处理文件的数据结构以

    2023年04月24日
    浏览(36)
  • Linux文件系统目录有什么用?

    学习文件系统的意义在于文件系统有很多设计思路可以迁移到实际的工作场景中,比如: MySQL 的 binlog 和 Redis AOF 都像极了日志文件系统的设计; B Tree用于加速磁盘数据访问的设计,对于索引设计也有通用的意义。 特别是近年来分布式系统的普及,学习分布式文件系统,也是

    2024年02月03日
    浏览(46)
  • ASCII编码的诞生:解决字符标准化与跨平台通信的需求

    在计算机的发展过程中,字符的表示和传输一直是一个重要的问题。为了实现字符的标准化和跨平台通信,ASCII(American Standard Code for Information Interchange)编码应运而生。 Ascii编码解码 | 一个覆盖广泛主题工具的高效在线平台(amd794.com) https://amd794.com/asciiencordec 在早期计算机系

    2024年02月19日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包