fat32

为什么32分区不支持大于4G的单个文件
2009年12月26日 星期六 18:55

FAT32分区基本构成与FAT32存储原理

http://www.sina.com.cn 2007年12月27日 09:42  太平洋电脑网
作者:非常可乐

  

  本文来自网络整理。

  FAT32是个非常有功劳的文件系统,Microsoft成功地设计并运用了它,直到今天NTFS铺天盖地袭来的时候,FAT32依然占据着 Microsoft Windows文件系统中重要的地位。FAT32最早是出于FAT16不支持大分区、单位簇容量大以致空间急剧浪费等缺点设计的。实际应用中,FAT32 还是成功的。

  
FAT32与FAT16的原理基本上是相同的,下图标出了FAT32分区的基本构成。

  

FAT32分区基本构成与FAT32存储原理

FAT32分区的基本构成

  
FAT32在格式化的过程中就根据分区的特点构建好了它的DBR,其中BPB参数是很重要的,可以回过头来看一下表4和表5。首先 FAT32保留扇区的数目默认为32个,而不是FAT16的仅仅一个。这样的好处是有助于磁盘DBR指令的长度扩展,而且可以为DBR扇区留有备份空间。 上面我们已经提到,构建在FAT32上的win98或win2000、winXP,其操作系统引导代码并非只占一个扇区了。留有多余的保留扇区就可以很好 的拓展OS引导代码。在BPB中也记录了DBR扇区的备份扇区编号。备份扇区可以让我们在磁盘遭到意外破坏时恢复DBR。

  
FAT32的文件分配表的数据结构依然和FAT16相同,所不同的是,FAT32将记录簇链的二进制位数扩展到了32位,故而这种 文件系统称为FAT32。32位二进制位的簇链决定了FAT表最大可以寻址2T个簇。这样即使簇的大小为1扇区,理论上仍然能够寻址1TB范围内的分区。 但实际中FAT32是不能寻址这样大的空间的,随着分区空间大小的增加,FAT表的记录数会变得臃肿不堪,严重影响系统的性能。所以在实际中通常不格式化 超过32GB的FAT32分区。WIN2000及之上的OS已经不直接支持对超过32GB的分区格式化成FAT32,但WIN98依然可以格式化大到 127GB的FAT32分区,但这样没必要也不推荐。同时FAT32也有小的限制,FAT32卷必须至少有65527个簇,所以对于小的分区,仍然需要使 用FAT16或FAT12。

  
分区变大时,如果簇很小,文件分配表也随之变大。仍然会有上面的效率问题存在。既要有效地读写大文件,又要最大可能的减少空间的浪费。FAT32同样规定了相应的分区空间对应的簇的大小,见下表:

  

FAT32分区基本构成与FAT32存储原理

FAT32分区大小及对应的簇的大小

  
FAT32簇的取值意义和FAT16类似,不过是位数长了点罢了,比较见下表:

  

FAT32分区基本构成与FAT32存储原理

FAT32簇的取值意义

  
FAT32的另一项重大改革是根目录的文件化,即将根目录等同于普通的文件。这样根目录便没有了FAT16中512个目录项的限 制,不够用的时候增加簇链,分配空簇即可。而且,根目录的位置也不再硬性地固定了,可以存储在分区内可寻址的任意簇内,不过通常根目录是最早建立的(格式 化就生成了)目录表。所以,我们看到的情况基本上都是根目录首簇占簇区顺序上的第1个簇。

  
FAT32对簇的编号依然同FAT16。顺序上第1个簇仍然编号为第2簇,通常为根目录所用(这和FAT16是不同的,FAT16的根目录并不占簇区空间,32个扇区的根目录以后才是簇区第1个簇)

  
FAT32的文件寻址方法与FAT16相同,但目录项的各字节参数意义却与FAT16有所不同,一方面它启用了FAT16中的目录项保留字段,同时又完全支持长文件名了。

  
对于短文件格式的目录项。其参数意义见下表:

  

FAT32分区基本构成与FAT32存储原理

FAT32短文件目录项32个字节的表示定义

  
说明:

  
(1)、这是FAT32短文件格式目录项的意义。其中文件名、扩展名、时间、日期的算法和FAT16时相同的。

  
(2)、由于FAT32可寻址的簇号到了32位二进制数。所以系统在记录文件(文件夹)开始簇地址的时候也需要32位来记录,FAT32启用目录项偏移0x12~0x13来表示起始簇号的高16位。

  
(3)、文件长度依然用4个字节表示,这说明FAT32依然只支持小于4GB的文件(目录),超过4GB的文件(目录),系统会截断处理。

  
FAT32的一个重要的特点是完全支持长文件名。长文件名依然是记录在目录项中的。为了低版本的OS或程序能正确读取长文件名文 件,系统自动为所有长文件名文件创建了一个对应的短文件名,使对应数据既可以用长文件名寻址,也可以用短文件名寻址。不支持长文件名的OS或程序会忽略它 认为不合法的长文件名字段,而支持长文件名的OS或程序则会以长文件名为显式项来记录和编辑,并隐藏起短文件名。

  
当创建一个长文件名文件时,系统会自动加上对应的短文件名,其一般有的原则:

  
(1)、取长文件名的前6个字符加上"~1"形成短文件名,扩展名不变。

  
(2)、如果已存在这个文件名,则符号"~"后的数字递增,直到5。

  
(3)、如果文件名中"~"后面的数字达到5,则短文件名只使用长文件名的前两个字母。通过数学操纵长文件名的剩余字母生成短文件名的后四个字母,然后加后缀"~1"直到最后(如果有必要,或是其他数字以避免重复的文件名)。

  
(4)、如果存在老OS或程序无法读取的字符,换以"_"

  
长文件名的实现有赖于目录项偏移为0xB的属性字节,当此字节的属性为:只读、隐藏、系统、卷标,即其值为0FH时,DOS和 WIN32会认为其不合法而忽略其存在。这正是长文件名存在的依据。将目录项的0xB置为0F,其他就任由系统定义了,Windows9x或 Windows 2000、XP通常支持不超过255个字符的长文件名。系统将长文件名以13个字符为单位进行切割,每一组占据一个目录项。所以可能一个文件需要多个目录 项,这时长文件名的各个目录项按倒序排列在目录表中,以防与其他文件名混淆。

  
长文件名中的字符采用unicode形式编码(一个巨大的进步哦),每个字符占据2字节的空间。其目录项定义如下表。

  

FAT32分区基本构成与FAT32存储原理

FAT32长文件目录项32个字节的表示定义

  
系统在存储长文件名时,总是先按倒序填充长文件名目录项,然后紧跟其对应的短文件名。从表15可以看出,长文件名中并不存储对应文 件的文件开始簇、文件大小、各种时间和日期属性。文件的这些属性还是存放在短文件名目录项中,一个长文件名总是和其相应的短文件名一一对应,短文件名没有 了长文件名还可以读,但长文件名如果没有对应的短文件名,不管什么系统都将忽略其存在。所以短文件名是至关重要的。在不支持长文件名的环境中对短文件名中 的文件名和扩展名字段作更改(包括删除,因为删除是对首字符改写E5H),都会使长文件名形同虚设。长文件名和短文件名之间的联系光靠他们之间的位置关系 维系显然远远不够。其实,长文件名的0xD字节的校验和起很重要的作用,此校验和是用短文件名的11个字符通过一种运算方式来得到的。系统根据相应的算法 来确定相应的长文件名和短文件名是否匹配。这个算法不太容易用公式说明,我们用一段c程序来加以说明。

  
假设文件名11个字符组成字符串shortname[],校验和用chknum表示。得到过程如下:

  
int i,j,chknum=0;
for (i=11; i>0; i--)
chksum = ((chksum & 1) ? 0x80 : 0) + (chksum >> 1) + shortname[j++];

  
如果通过短文件名计算出来的校验和与长文件名中的0xD偏移处数据不相等。系统无论如何都不会将它们配对的。

  
依据长文件名和短文件名对目录项的定义,加上对簇的编号和链接,FAT32上数据的读取便游刃有余了。

 

 

 

从汇编的角度说,CPU把要传到硬盘中的数据首先放在内存中,然后把I/O访问地址写到硬盘,使用MOV命令对从内存中向硬盘写数据。

这里面还要涉及I/O地址锁存器(传输过程),和对硬盘物理地址的访问和控制。


这是最底层的机器代码


举例:

mov ax,0201h 
mov cx,0001h 
mov dx,0080h 
mov bx,f000h 
int 13h ;将MBR读入硬盘0000:f000H 


mov ch,01H 
mov cl,01h 
mov dh,[f1bOh] ;要写入的柱面号此时保存在0000:f1b0h 
mov dl,80h 
WRITE: 
mov ax,033fh ;一次写63个扇区 
mov bx,0000h ;
int 13h 
cmp ch,ffh 
jz next1 
INC ch 
jmp write 
next1: 
add cx,40h 
cmp cx,ffc1h ;是否写完一个柱面 
jz next2 
mov ch,00h 
jmp write 
next2: 
cmp dh,ff 
jz exit ;硬盘已写完 
inc dh ;磁头数加1 
mov [f1b0h],dh 
push ax 
push bx 
push cx 
push dx 
mov ax,0201h 
mov cx,0001h 
mov dx,0080h 
mov bx,f000h 
int 13h ;将DH中的柱面号保存 
pop dx 
pop cx 
pop bx 
pop ax 
mov cx,0001 
jmp write 
exit:


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值