目录
标准
从需求出发
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微软只用在软盘上。
从需求出发
以档案馆作为例子来看,要存放的文件就是档案,存放的位置就是档案柜。文件存入档案馆后为了方便查找,我们通常会做一个目录或是索引,索引中至少需要有文件名和存放位置,大致如下。
如果来了一份档案,内容很多,一个位置放不下,可以如下方式存放(暂时ok)。
这份档案后期又有新的内容补充,
但这份档案越来越多后,文件在索引中和物理位置上都不连续,查收起来会有麻烦,而且比较容易遗漏,比如没有看到“文件名5-4”。可以如下:
这样也是可以的,但每次有新档案加入,就需改写一遍之前的,也不太好。
另外,档案多了以后,我们也不容易知道哪个些位置是空的,哪些位置是满的,如何改善呢?
FAT的方式是,另外做一个索引或表,用来标记位置的使用情况,
这样,哪些位置是空的,哪些是满的,就一目了然了,新来的档案也比较容易找到哪个位置够大。
结合这个“位置表”和文件-位置索引表,位置表中的状态信息做一下补充(除了满、空之外,再补充一下,文件的结束,及如果没结束,剩下的部分的位置号),对于“文件名5”的存放以有另外一个方式,如下
这就是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),结构如下
由于FAT很重要,所以在FAT可以有备份,在FAT12中一般是有一个备份。然后就是下面的样子。
从计算机发展看,是新的计算机,后有磁盘(在磁盘发明前,前面还有其它的方式来存储信息),所谓的“计算机文件系统”是在计算机+磁盘的使用过程中诞生(在电脑上实现人脑中的想法,或是将系统由其它介质(如纸)移植到电脑),后又强化或方便了磁盘的使用的。
在“计算机文件系统”发明前,文件系统的概念一定时存的,如同我们上面的图表,只是不存在于电脑中,而是存于人脑中,记录在纸或其它介质上。
而计算机(很多东西也一样),需要具备向后的兼容性,所以也是一点点由小到大,由少到多的积过程。也正因如此,从小的、简陋的开始了解,往往看似难,实则更容易找到本源,更容易理解后期的成品。
在FAT_0前面还有一个保留区域,猜测是兼容的原因。所以完整的FAT系统如下:
下面我们一起来一点一点的分解(以FAT12为例,也是最小的FAT文件系统)。
分解前,首先明确几个数据的组织单位。
- 数据的最小单位是bit(比特),
- 8bit (比特)= Byte(字节),
- 512Byte(字节)=1Sector(扇区)(不一定都是,但对软盘来是的)
- 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,基本输入输出系统)结构如下。
白皮书中有如下描述:
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.
几点:
- 在MS-DOS1.x时代,FAT的保留扇区(Sector 0 )中是没有BPB信息的
- BPB信息是在MS-DOS2.x中加入的
- FAT[0]中的低8位,被历史原因占用了
##测试记录
在Win XP Pro Sp3 CN下没有BPB的软盘是不被识别的,认为是未被格式化的。
(在虚拟机中测试的;
- 加载一个空的软盘映像
- 用Win XP Pro Sp3 CN格式化,放入几个测试文件,退出映像
- 用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启动软盘的分析截图。
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
主目录区的样子如下图
自然,RootDirSectors(根目录占用扇区数)
向上圆整可以替换为
每个条目的字节数固定为32byte
占用字节数:=14x512=7168 = 0x1C00
RootDirSectors末地址=0x41FF
数据区Data Region
DataRegion的首地址:0x4200
到此为止,各个大区域的地址都确认到了,FAT(12)的样子如下:
文件(文件夹)的存放
接下来就是文件(文件夹的存放)
- 在根目录中找一个空闲区域
- 到FAT数据结构(FAT-FileAllocateTable本名就是表,不便称为FAT表)中找一个空闲数据区域(Cluster)
- 将以上两项的信息合并,作为一个条目(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 文件大小
测试:
- 新建一个软盘映像
- 用虚拟机中的Win XP Pro SP3(下同)格式化,
- 并依次写入文件
- A1A2AEA4.txt 内容为重复的字母"a",长度小于512byte;
- B1B2B3B4.txt 内容为重复的字母"b",长度小于512byte;
- C1C2C3C4.txt 内容为重复的字母"c",长度小于512byte;
- 文件夹:FOLD_A1A
- 在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处,找到了三个文件和一个文件夹
各文件的数据区数据:
序号 | 文件名 | 首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"的内容,如下
紧接近在0x4800的位置,找到的文件夹“FOLD_A1A”的内容。(暂时是推)
按DirEntry的格式分析一下0x4800的数据,如下图:
发现这里有3个文件(Entry),
再向下找,分在0x4A00的位置找到文件“D1D2D3D4.TXT”的内容,如下:
把两个表格合并到一起,把根目录的地址也填上,得到下表:
序号 | 文件名 | 首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 |
这样理论和实物就手工对上了。
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就是“卷标”。
2、文件是在其它文件夹是建好,然后逐个移入的,如果我们在接在文夹或文件,直观的看起来,系统会在文件夹下放一下“新建文件夹”或是“新建 文本文档.txt”,而且处于改名状态。预计系统是分两步进行的:
A、先在磁盘上完成了一个完整的“新建”动作;(我们用的是中文系统,此时写入的DirEntry中使用了中文文件名UTF-16,和长文件名两个后来补充内FAT(12)文件系统的功能),增加了复杂度;
B、执行改名操作。文件改名的操作,并不是修改原来的DirEntry,而是将原来的标记为删除,并新插入了一条DirEntry,所以也会增加复杂度。
关于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的状态信息。
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表示,我们现在的样子如下:
我们将第一个文件A1A2AEA4.TXT的内容增加到>1K后(直接对比如下),(备注,文件名写错了)
即如下图所示,按照1、2、4、5、6的顺序完成的文件内容的查找
文件的内容刚好如前面推算的,在0x4C00和 0x4E00的位置。
LBA到CHS
上面的地址地址偏移都是基于逻辑地址的,而实访问的磁盘是硬件相关的,比如软盘是按Cylider(柱面)、Head(磁头)、Sector(扇区)进行编号的。(似乎机械硬盘也是如些),这里需要有一下地址转换。
(图来自《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,刚好余了一点点儿。文章来源:https://www.toymoban.com/news/detail-501418.html
---------FAT12的主线部分就理清,告一段落了。文章来源地址https://www.toymoban.com/news/detail-501418.html
到了这里,关于FAT12文件系统 理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!