微软在Dos/Windows系列操作系统中共使用了6种不同的文件系统(包括即将在windows的下一个版本中使用的Winfs)。它们分别是:FAt12、FAT16、FAT32、NTFS、NTFS5.0和WINFS。其中FAt12、FAT16、FAT32均是FAT文件系统。是File Allocation Table的简称。

1. FAT12

  这是伴随着Dos诞生的“老”文件系统了。它采用12位文件分配表,并因此而得名。而以后的FAT系统都按照这样的方式在命名。在DOS3.0以前使用。但是在现在,我们都还能找得到这个文件系统:用于软盘驱动器。当然,其他地方的确基本上不使用这个文件系统了。FAT12可以管理的磁盘容量是8M。这在当时,没有硬盘的情况下,这个磁盘管理能力是非常大的。

  以3.5英寸的1.44M标准格式化的FAT12文件系统的软盘为例,当软盘被标准格式化后,每磁头80个柱面(磁道),每个柱面有18个扇区,每个扇区有512字节空间。所以标准软盘的总空间(容量)为:2*80*18*512=1474560B=1440K=1.44M

但是1.44M的软盘格式化可以不是1.44M,可以大于也可以小于;格式化的文件系统也可以不是FAT12。为什么会出现正常的1.44M软盘格式化后可大可小的情况呢?从软盘及软盘驱动器原理出发,软盘的寻址方式(可以认为是读取数据的方式)是:CHS,C = Cylinder(柱面),H = Header(磁头),S = Sector(扇区)。标准地格式化后,磁盘将被格式化为 每面80磁道(80个同心圆,柱面),每个磁道有18个扇区,每个扇区是 512字节,那么高密3.5英寸软盘的容量为:2×80×18×512 = 1474560 Byte = 1440 KB = 1.44 MB。然而,软盘可以不格式为80磁道,每个磁道也可以不是18扇区。

FAT12文件系统将按照下表所示的方式划分全部的容量,即文件系统数据结构:

FAT12 2880扇区 (1474560B) 逻辑扇区 占用扇区 内容 磁盘CHS参数(磁头/柱面/扇区)
0 1(512B) 引导程序 起:0/0/1
1 9(4608B) FAT文件分配表1 起:0/0/2 止:0/0/10
10 9(4608B) FAT文件分配表2 起:0/0/11 止:1/0/1
19 14(9728B) 根目录  
33 14(9728B) 文件数据区  

操作系统之所以认识FAT12格式的磁盘,其秘密就在于逻辑0扇区这512B上。如果这512字节的最后两个字节的内容分别是55和AA(0xAA55低字节在前,高字节在后)的话,BIOS在启动时会将这个扇区读取到0:7C00h-0:7DFFh处,然后跳转到0:7C00h处继续执行指令,操作系统即用此来达到引导系统的目的,而这个磁盘就称为可引导磁盘。操作系统标识FAT12文件系统是因为在逻辑0扇区(即引导扇区)处还存储着一个特定的数据结构,此结构有固定的格式,在操作系统将此磁盘格式化时自动生成,具体数据结构如下表所示:

标识 偏移量 类型 大小 说明 默认值
 

0

db

3

跳转指令  
BS_OEMName

3

db

8

OEM字符串,必须为8个字符,不足以空格填空 MSWIN4.1
BPB_BytsPerSec

11

dw

2

每扇区字节数 200h
BPB_SecPerClus

13

db

1

每簇占用的扇区数 1
BPB_RsvdSecCnt

14

dw

2

保留扇区数 1
BPB_NumFATs

16

db

1

FAT表的记录数 2
BPB_RootEntCnt

17

dw

2

最大根目录文件数 0e0h
BPB_TotSec16

19

dw

2

逻辑扇区总数 0b40h
BPB_Media

21

db

1

媒体描述符 0f0h
BPB_FATSz16

22

dw

2

每个FAT占用扇区数 9
BPB_SecPerTrk

24

dw

2

每个磁道扇区数 12h
BPB_NumHeads

26

dw

2

磁头数 2
BPB_HiddSec

28

dd

4

隐藏扇区数 0
BPB_TotSec32

32

dd

4

如果BPB_TotSec16是0,则在这里记录扇区总数 0
BS_DrvNum

36

db

1

中断13的驱动器号 0
BS_Reserved1

37

db

1

未使用 0
BS_BootSig

38

db

1

扩展引导标志 29h
BS_VolID

39

dd

4

卷序列号 0
BS_VolLab

43

db

11

卷标,必须是11个字符,不足以空格填充  
BS_FileSysType

54

db

8

文件系统类型,必须是8个字符,不足填充空格 FAT12  
 

62

引导代码,由偏移0字节处的短跳转而来  
 

510

dw

2

系统引导标识 0aa55h  

首先是跳转指令,偏移0处的跳转指令必须是合法的可执行的基于x86的CPU指令,如:jmp start,这样可以生成3字节长的指令,(加关键字short的短跳转指令的长度是2字节),指向操作系统引导代码部分。Windows和MS-DOS生成的FAT12启动扇区中的跳转指令是短跳转,如:jmp short start,然后加一个nop的空指令来保持3字节的长度。

接着是位于偏移3处的OEM字符串,它必须是一个8字节长的字符串,标识了格式化此磁盘的操作系统的名称和版本号,为了保留与MS-DOS的兼容性,通常Windows 2000系统格式化的磁盘上在此记录中的字符串是“MSDOS5.0”,在Windows 95系统格式化的磁盘上在此记录中的字符串是“MSWIN4.0”,在Windows 95 OSR2和Windows 98系统上格式化的磁盘上在此记录中的字符串是“MSWIN4.1”。

  

  接下来是每扇区的字节数,类型是双字节长,标准分区上的每扇区字节数一般是512B,但也可以是其它的数字,如1024,2048和4096,FAT12的格式下设置为512(200h)。

  偏移13处的是每簇所占用的扇区,类型是字节,簇是数据存储的最小单位,此字段的值取决于分区的大小,在FAT12格式下一般为1,即每簇只有1个扇区(512字节),簇越大,那么分区的容量也就越大,通过增加簇的扇区数,可以支持更大的磁盘分区,标准的簇大小为1、2、4、8、16、32、64和128,FAT12格式下只能管理2^12个簇(4096),所以在FAT12格式下能管理和分配的最大空间为:4096*1*512=2097152B=2M,所以FAT12一般只适合3.5寸高密度软盘(1.44M)。

保留扇区指的是在第一个FAT文件分配表之前的引导扇区,一般情况下只保留1个扇区(512B)。

接下来是类型为1字节长的FAT表的总数,默认情况下此字段的值为2,也就是有两个FAT表,FAT1和FAT2的内容相同,当FAT1表出错的时候可以使用FAT2来恢复文件分配表。

位于偏移17处的字段是类型为双字节长的能够储存在根目录下的最大文件(包含子目录)数量,默认为224,每个目录或文件名占用32B的空间,因此根目录的大小为:224*32=7168B=7KB,如果使用长文件名的话,根目录文件数还可能无法达到224的数量。

接下来是位于偏移19处的逻辑扇区总数,类型是双字节,如果此磁盘的逻辑扇区总数大于2^16位(65536)的话,就设置此字段为0,然后使用偏移32处的双字来表示逻辑总扇区数。

位于偏移21处的是单字节长的磁盘类型标识符,使用0f0h表示3.5寸高密码软盘,用0f8h来表示硬盘。此字段主要用于FAT12或FAT16的分区格式中,在Windows 2000中未使用。

偏移22处双字节长的是每个FAT文件分配表所占用的扇区数,操作系统用这个字段和FAT表数量以及隐藏扇区数量来计算根目录所在的扇区。还可以根据最大根目录数来计算用户数据区从哪里开始。

根目录扇区位置=FAT表数量*FAT表所占用的扇区数量+隐藏扇区数量

用户数据开始位置=根目录扇区位置+根目录所占用扇区(FAT12格式下为224*32/512)

此处所说的扇区指的是逻辑(线性)扇区,需要通过转换才能得到CHS磁盘参数,然后通过CHS参数来读写磁盘扇区。

接下来是位于偏移24处的每磁道扇区总数,类型是双字节长,软盘的默认值为18,即每个磁道有18个扇区。

然后是双字节长的磁头数,磁头数指的是磁盘面数,每面都有一个磁头,软盘都是2面的,所以在FAT12格式下此字段固定为2。

接下来是的位于偏移28处类型为双字(4B)长的隐藏扇区数,指的在引导扇区之前的隐藏扇区,在FAT12格式上此字段默认为0,即不隐藏任何扇区,此字段参与计算根目录区和用户数据区位置。

偏移32处的是类型为双字(4B)长的逻辑扇区总数,如果此分区或磁盘的逻辑扇区总数大于65536则用这个字段来表示逻辑扇区总数,否则设置此字段为0后用位于偏移19处的双字节字段来表示。

偏移36处的是物理驱动器号,类型是字节长,它与BIOS物理驱动器相关,在磁盘中断Int13h相关的操作中使用,第一个软盘驱动器设置为0,第一个硬盘驱动器设置为80h,第二个硬盘驱动器设置为81h,以此类推。此字段的值可以在系统引导时用dl寄存器得到。

位于偏移37处的字节没有使用,保留并设置为0。

位于偏移38处的是扩展引导标识,类型是字节,操作系统用它来识别引导信息,值可以是28h或29h。

接下来的是位于偏移39处的卷标号,类型是双字(4B)长,在格式化磁盘时所产生的一个随机序号,有助于区分磁盘,可以为0。

然后是位于偏移43处的卷标,长度必须是11字节长(不足以空格20h填充),此字段只能使用一次,用来保存磁盘卷的标识符,再次设置的时候被保存到根目录中作为一个特殊的文件来储存。

最后是位于偏移54处的是长度为8字节的文件系统类型标识符,不足8字节则以空格20h来填充。FAT12格式下此字段为“FAT12   ”,相应的还有“FAT16   ”和“FAT32   ”。但要注意的是,操作系统并不使用这个字段来识别此磁盘所用的文件系统。

我们先来看看文件分配表的数据格式,文件分配表所在的扇区应该是(隐藏扇区+保留扇区)=0+1=第1扇区处,从第1扇区开起到第9扇区结束,第一个文件分配表共占用9个扇区,第二个文件分配表从第10个扇区开始到第18扇区结束,在引导扇区的数据结构中明明确的指出了这些位置。

文件分配表数据结构如下图所示:

在FAT表开始扇区的第1字节是存储介质,0f0h代表软盘,0f8代表硬盘;第2、3这两个字节都是0ffh,代表了FAT文件分配表标识符,从第四个字节开始与用户数据区所有的簇一一对应,应该注意的是,用户数据区的第一个簇的序号是002,而不是000,因为储存介质和标识符占用了这两个序号。

在FAT12格式中用12比特位来代表一个簇的序号,我们知道,每个字节有8位比特,所以每个簇要占用1.5个字节,也就是说,占用了第1字节和第2字节的一半才能表示一个簇的序号,半字节的拆分办法按照下图的方式进行:

例如:在FAT表中开始位置储存的字节内容依次是F0 FF FF FF 4F 00 05 F0 FF,前面三个字节是储存介质和标识符,我们不管它,前面三个字节占用了0和1这两个簇序号,那么就应该从2簇开始了。经过转换得到的簇序号是:0fffh 004h 005h 0fffh,簇号是12位比特,第4字节(1111 1111)的作为第2簇号的低8位(0-7),第5字节(4F)的低4位(1111)作为第2簇号的高4位(8-11),这样就得到了第2簇号的内容为0fffh;然后第5字节的高4位(0100)作为第3簇号的低4位(0-3),第6字节(0000 0000)作为第3簇号的高8位(4-11),这样便得到了第3簇号的内容为004h;第7字节(0000 0101)作为第4簇号的低8位(0-7),第8字节的低4位(0000)作为第4簇号的高4位(8-11),这样可以得到第4簇号的内容为005h;第8字节的高4位(1111)作为第5簇号的低4位(0-3),第9字节(1111 1111)作为第5簇号的高8位(4-11),这样得到第5簇号的内容为0fffh。

  Fat12文件系统的限制:
  1)文件名:只能是8.3格式的文件名。   

  2)磁盘容量:最多8M。(4096clusters×4sectors/clusters×512bytes、sectors)   

  3)文件碎片严重。(只在磁盘上不存储在不连续的簇内。)

Windows文件系统的更多相关文章

  1. Windows文件系统漏洞

    1.Windows中很有用的文件替换命令,绕过文件保护用来替换文件的replace,连正在使用的文件也能替换.非常无敌. 比如:在C:下建一个目录,c:aaa 然后复制一首mp3到c:aaa并命名为c ...

  2. Linux 文件系统类型 文件系统结构 与Windows文件系统的比较

    摘自:http://blog.csdn.net/gelivable007/article/details/7249365 Linux 文件系统类型 磁盘文件系统.包括硬盘.CD-ROM.DVD.USB ...

  3. 【Windows Server存储】windows文件系统

    windows文件系统 弹性文件系统(ReFS) 无检查磁盘,Windows 8或Windows Server 2012以上运行. 参考资料表明,这是一个失败的文件系统,以后将不会商用. 参考资料:h ...

  4. 【干货】查看windows文件系统中的数据—利用簇号查看文件与恢复文件

    前面我们使用这个软件发现了很多删除掉的数据,今天来看看簇.FAT文件系统中,存在一个簇的链接,我知道了簇1在哪里就可以顺藤摸瓜恢复所有的信息. 这里使用FAT 12为例子,FAT其他万变不离其宗,甚至 ...

  5. Mac如何像Windows一样在文件系统中查看文件?

    许多Windows系统用户刚转向Mac的时候,肯定非常不适应Mac系统独特的文件系统,就像安卓转iOS系统一样,那么Mac电脑如何像Windows系统一样,能够查看电脑上的各个盘,如C盘D盘等等,然后 ...

  6. 文件系统管理 之 Linux 创建文件系统及挂载文件系统流程详解

    阅读此文,必须具备知识点:<Linux 查看磁盘分区.文件系统.使用情况的命令和相关工具介绍><实例解说 fdisk 使用方法><合理规划您的硬盘分区><Fe ...

  7. Xen虚拟机磁盘镜像模板制作(一)—Windows Server 2008(2012)

    这段时间一直在研究如何制作一个适合Xen虚拟化的Windows Server 2008(2012)磁盘镜像,中间虽然遇到了一些阻挠,不过最终还是顺利解决,成功制作出了Xen Windows Serve ...

  8. Linux开机自动挂载Windows分区

    使用Linux的朋友肯定都不会对本文所谈的内容陌生,在Linux系统里,通常不会开机自动挂载Windows文件系统下的分区.Ubuntu系统下要点击Windows分区才会挂载,Fedora下则甚至要输 ...

  9. AzCopy – 上传/下载 Windows Azure Blob 文件

    在我们收到的请求中,有一个频繁出现的请求是提供一种能在 Windows Azure Blob 存储与其本地文件系统之间轻松上传或下载文件的方法.一年半前, 我们很高兴地发布了 AzCopy, Wind ...

随机推荐

  1. 20165234 《Java程序设计》第八周学习总结

    第八周学习总结 教材内容学习 第十二章 Java 多线程机制 进程与线程 进程是程序的一次动态执行过程,对应了从代码加载.执行至执行完毕的一个完整过程. 线程不是进程,是比进程更小的执行单位. 一个进 ...

  2. centos系统下安装python3以及pip3

    首先查看一下系统当前的python版本 python -V 1.安装必要工具 yum-utils 它的功能是管理repository及扩展包的工具yum install yum-utils -y 2. ...

  3. 对象及变量的并发访问(同步方法、同步代码块、对class进行加锁、线程死锁)&内部类的基本用法

    主要学习多线程的并发访问,也就是使得线程安全. 同步的单词为synchronized,异步的单词为asynchronized 同步主要就是通过锁的方式实现,一种就是隐式锁,另一种是显示锁Lock,本节 ...

  4. Thymeleaf模板布局

    ⒈定义片段 1.使用th:fragment <div th:fragment="copy"> © 2019 <a href="http://www.co ...

  5. Xilinx原语学习之时钟资源相关原语

    一直来,都是使用Vivado中自带的GMIItoRGMII IP核来完成GMII转RGMII的功能:尽管对GMII及RGMII协议都有一定的了解,但从没用代码实现过其功能.由于使用IP时,会涉及到MD ...

  6. linux中bashrc与profile的区别

    bashrc与profile的区别 要搞清bashrc与profile的区别,首先要弄明白什么是交互式shell和非交互式shell,什么是login shell 和non-login shell. ...

  7. linux批量替换文件内容3种方法(perl,sed,shell)

    方法1:perl   这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把 ...

  8. docker拉取镜像报错:net/http: TLS handshake timeout.

    docker拉取镜像报错:net/http: TLS handshake timeout. 启动一个后台的busybox容器 [yunva@node1 network-scripts]$ docker ...

  9. T-SQL ORDER BY子句 排序方式

    MS SQL Server ORDER BY子句用于根据一个或多个列以升序或降序对数据进行排序. 默认情况下,一些数据库排序查询结果按升序排列. 语法 以下是ORDER BY子句的基本语法. SELE ...

  10. Light OJ 1148

    题意: 给你N 个人, 每个人说出有多少人和他一队, 不包括他自己, 输出总人数最少值 思路: 排个序, 按照给的数目把人分为一组,就可以得出最少人数 #include<bits/stdc++. ...