根据自己电脑的fat,fat32分区来学习fat,fat32文件系统
fat16和fat32文件系统学习 - 下载频道 - CSDN.NET
http://download.csdn.net/detail/guyue35/9392290
FAT文件系统原理(一)---北亚数据恢复服务中心 4006-505-808
http://www.raid-recovery.org/Article/sjhfdoc/200404/1.html
FAT文件系统原理(一) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
一、硬盘的物理结构:
二、硬盘的逻辑结构。 三、磁盘引导原理。 3.1 MBR(master boot record)扇区: 你的硬盘的MBR引导代码可能并非这样。不过即使不同,所执行的功能大体是一样的。这是wowocock关于磁盘mbr的反编译,已加了详细的注释,感兴趣可以细细研究一下。
注:上表中的超过1字节的数据都以实际数据显示,就是按高位到地位的方式显示。存储时是按低位到高位存储的。两者表现不同,请仔细看清楚。以后出现的表,图均同。 也可以在winhex中看到这些参数的意义:
扩展分区表项中的相对扇区数字段所显示的是从扩展分区开始到逻辑驱动器中第一个扇区的位移的字节数。总扇区数字段中的数是指组成该逻辑驱动器的扇区数目。总扇区数字段的值等于从扩展分区表项所定义的引导扇区到逻辑驱动器末尾的扇区数。 有时候在磁盘的末尾会有剩余空间,剩余空间是什么呢?我们前面说到,分区是以1柱面的容量为分区粒度的,那么如果磁盘总空间不是整数个柱面的话,不够一个柱面的剩下的空间就是剩余空间了,这部分空间并不参与分区,所以一般无法利用。照道理说,磁盘的物理模式决定了磁盘的总容量就应该是整数个柱面的容量,为什么会有不够一个柱面的空间呢。在我的理解看来,本来现在的磁盘为了更大的利用空间,一般在物理上并不是按照外围的扇区大于里圈的扇区这种管理方式,只是为了与操作系统兼容而抽象出来CHS。可能其实际空间容量不一定正好为整数个柱面的容量吧。关于这点,如有高见,请告知http://www.sjhf.net或[email protected],[email protected]。 |
FAT文件系统原理(二)---北亚数据恢复服务中心 4006-505-808
http://www.raid-recovery.org/Article/sjhfdoc/200404/2.html
FAT文件系统原理(三)---北亚数据恢复服务中心 4006-505-808
http://www.raid-recovery.org/Article/sjhfdoc/200404/3.html
FAT文件系统原理(三) | ||||
|
||||
4.3 FAT表和数据的存储原则。 FAT表(File Allocation Table 文件分配表),是Microsoft在FAT文件系统中用于磁盘数据(文件)索引和定位引进的一种链式结构。假如把磁盘比作一本书,FAT表可以认为相当于书中的目录,而文件就是各个章节的内容。但FAT表的表示方法却与目录有很大的不同。 单击此处查看PDF版全文 我们再考虑如何来写这三个文件的目录。对于每个文件而言,一定要记录的有:文件名,开始簇,大小,创建日期、时间,修改日期、时间,文件的读写属性等。这里大小能不能用结束簇来计算呢?一定不能,因为文件的大小不一定就是整数个簇的大小,否则的话像B.TXT的内容就是54KB的内容了,少了固然不行,可多了也是不行的。那么我们怎么记录呢?可以想象一下。为了管理上的方便,我们用数据库的管理方式来管理我们的目录。于是我把1KB再分成10份,假定开始簇号为0,定义每份100B的各个位置的代表含义如图4.3.2 这样设计的结构绝对可以对文件进行正确的读写了。接着让我们设计的文件系统工作吧。先改动个文件,比如A.TXT,增加点内容吧!咦?增加后往哪里放呀,虽然存储块的后面有很多空间,但紧随其后B.TXT的数据还顶着呢?要是把A.TXT移到后边太浪费处理资源,而且也不一定解决问题。这个问题看来暂时解决不了。 这个操作看来还可以,我们接着做,在存入一个文件D.txt(大小为60.3KB),总共100簇的空间只用了31簇,还有68簇剩余,按说能放下。可是?往那里放呢?没有61个连续的空间了,目录行没办法写了,看来无连续块存储暂时也不行。 看来我们设计的文件系统有致命的漏洞,怎么解决呢?。。。。 其实可以这样解决: 第一簇用来记录数据区中每一簇的被占用情况,暂时称其为文件分配表。结合文件分配表和文件目录就可以达到完全的文件读取了。我们想到,把文件分配表做成一个数据表,以图4.3.7的形式记录簇与数据的对应。 参照图4.3.8来理解一下文件分配表的意义。如文件a.txt我们根据目录项中指定的a.txt的首簇为2,然后找到文件分配表的第2簇记录,上面登记的是3,我们就能确定下一簇是3。找到文件分配表的第3簇记录,上面登记的是4,我们就能确定下一簇是4......直到指到第11簇,发现下一个指向是FF,就是结束。文件便丝毫无误读取完毕。 我们再看上面提到的第三种情况,就是将b.txt删除以后,存入一个大小为60.3KB的d.txt。利用簇链可以很容易的实现。实现后的磁盘如图4.3.9 4.3.10 4.3.11 上面是我们对文件存储的一种假设,也该揭开谜底的时候了。上面的思想其实就是fat文件系统的思想的精髓(但并不是,尤其像具体的参数的意义与我们所举的例子是完全不同的。请忘掉上边细节,努力记忆下边)。 单击此处查看PDF版全文 |
FAT文件系统原理(四)---北亚数据恢复服务中心 4006-505-808
http://www.raid-recovery.org/Article/sjhfdoc/200404/4.html
FAT文件系统原理(四) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
★FAT16存储原理: 当把一部分磁盘空间格式化为fat文件系统时,fat文件系统就将这个分区当成整块可分配的区域进行规划,以便于数据的存储。一般来讲,其划分形式如图7所示。我们把FAT16部分提取出来,详细描述一下:
格式化FAT16分区时,格式化程序根据分区的大小确定簇的大小,然后根据保留扇区的数目、根目录的扇区数目、数据区可分的簇数与FAT表本身所占空间 来确定FAT表所需的扇区数目,然后将计算后的结果写入DBR的相关位置。
看一幅在winhex所截FAT16的文件分配表,图10: FAT表记录了磁盘数据文件的存储链表,对于数据的读取而言是极其重要的,以至于Microsoft为其开发的FAT文件系统中的FAT表创建了一份备份,就是我们看到的FAT2。FAT2与FAT1的内容通常是即时同步的,也就是说如果通过正常的系统读写对FAT1做了更改,那么FAT2也同样被更新。如果从这个角度来看,系统的这个功能在数据恢复时是个天灾。 FAT文件系统的目录结构其实是一颗有向的从根到叶的树,这里提到的有向是指对于FAT分区内的任一文件(包括文件夹),均需从根目录寻址来找到。可以这样认为:目录存储结构的入口就是根目录。
对图10中的一些取值进行说明: 对于整个FAT分区而言,簇的分配并不完全总是分配干净的。如一个数据区为99个扇区的FAT系统,如果簇的大小设定为2扇区,就会有1个扇区无法分配给任何一个簇。这就是分区的剩余扇区,位于分区的末尾。有的系统用最后一个剩余扇区备份本分区的DBR,这也是一种好的备份方法。 ★FAT32存储原理:
FAT32在格式化的过程中就根据分区的特点构建好了它的DBR,其中BPB参数是很重要的,可以回过头来看一下表4和表5。首先FAT32保留扇区的数目默认为32个,而不是FAT16的仅仅一个。这样的好处是有助于磁盘DBR指令的长度扩展,而且可以为DBR扇区留有备份空间。上面我们已经提到,构建在FAT32上的win98或win2000、winXP,其操作系统引导代码并非只占一个扇区了。留有多余的保留扇区就可以很好的拓展OS引导代码。在BPB中也记录了DBR扇区的备份扇区编号。备份扇区可以让我们在磁盘遭到意外破坏时恢复DBR。
簇的取值意义和FAT16类似,不过是位数长了点罢了,比较见表13:
说明: FAT32的一个重要的特点是完全支持长文件名。长文件名依然是记录在目录项中的。为了低版本的OS或程序能正确读取长文件名文件,系统自动为所有长文件名文件创建了一个对应的短文件名,使对应数据既可以用长文件名寻址,也可以用短文件名寻址。不支持长文件名的OS或程序会忽略它认为不合法的长文件名字段,而支持长文件名的OS或程序则会以长文件名为显式项来记录和编辑,并隐藏起短文件名。 长文件名的实现有赖于目录项偏移为0xB的属性字节,当此字节的属性为:只读、隐藏、系统、卷标,即其值为0FH时,DOS和WIN32会认为其不合法而忽略其存在。这正是长文件名存在的依据。将目录项的0xB置为0F,其他就任由系统定义了,Windows9x或Windows 2000、XP通常支持不超过255个字符的长文件名。系统将长文件名以13个字符为单位进行切割,每一组占据一个目录项。所以可能一个文件需要多个目录项,这时长文件名的各个目录项按倒序排列在目录表中,以防与其他文件名混淆。
系统在存储长文件名时,总是先按倒序填充长文件名目录项,然后紧跟其对应的短文件名。从表15可以看出,长文件名中并不存储对应文件的文件开始簇、文件大小、各种时间和日期属性。文件的这些属性还是存放在短文件名目录项中,一个长文件名总是和其相应的短文件名一一对应,短文件名没有了长文件名还可以读,但长文件名如果没有对应的短文件名,不管什么系统都将忽略其存在。所以短文件名是至关重要的。在不支持长文件名的环境中对短文件名中的文件名和扩展名字段作更改(包括删除,因为删除是对首字符改写E5H),都会使长文件名形同虚设。长文件名和短文件名之间的联系光靠他们之间的位置关系维系显然远远不够。其实,长文件名的0xD字节的校验和起很重要的作用,此校验和是用短文件名的11个字符通过一种运算方式来得到的。系统根据相应的算法来确定相应的长文件名和短文件名是否匹配。这个算法不太容易用公式说明,我们用一段c程序来加以说明。 int i,j,chknum=0; 如果通过短文件名计算出来的校验和与长文件名中的0xD偏移处数据不相等。系统无论如何都不会将它们配对的。 五、结束。 本文出自数据恢复网(www.sjhf.net),疏漏在所难免,希望指正。若需转载请保留此信息;若需修改,请用以下方式与作者取得联系 单击此处查看PDF版全文 |
FAT32文件系统的存储组织结构(一)-曾德标-ChinaUnix博客
http://blog.chinaunix.net/uid-26913704-id-3213948.html
分类: WINDOWS
对磁盘的物理结构,逻辑结构和存储结构有了比较深入的了解后,我们来仔细探讨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。 (guyue:实际测试文件结束符是FF FF FF 0F)
如果某个簇存在坏扇区,则整个簇会用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文件系统的存储组织结构(二)-曾德标-ChinaUnix博客
http://blog.chinaunix.net/uid-26913704-id-3213951.html
分类: WINDOWS
前面已经基于一个格式化的空U盘分析了一下FAT32文件系统存储的组织结构,下面我们从文件操作的角度来分析一下文件系统的运作机制。由于换了个U盘,所以仍然贴出刚格式化的空U盘的几个重要的数据区如下:
我们可以看出,在分区格式化的时候,系统将卷标TEST_FAT32存储在2号簇,即跟目录区,如上面根目录贴图所示。同时,在FDT区2号簇标记位置写入了文件结束符FF FF FF 0F。显然,FAT32文件系统将目录当做普通文件来处理的。
下面我们在根目录下新建一个文件夹TEST1,看会有什么变化:
建立了TEST1文件夹后,FDT变成如下:
根目录变成如下:
重新分配了3号簇:
从上面的变化可以直观的看出,系统在新建文件夹时完成了如下动作:
a.在父目录所在簇上建立新的目录项,存储当前所建文件夹信息。
b.分配一个新簇,给新建的文件夹建立两个目录项:父目录和当前目录。
c.在FDT表中新分配的簇对应的位置上写下文件结束符。
d.建立各部分的链路关系:新建文件夹所对应的目录项的文件起始簇号字段写上新分配簇的簇号,新簇上的两个目录项的文件起始簇号字段分配写上父目录所在簇号(此处是0,本来我以为是2,即根目录所在簇,不知道为什么,可能特地用0指示根目录吧)和当前簇号(此处是3)。
为了验证我们上面分析的正确性,我们再在TEST1文件夹下建立新文件夹TEST11,看是否做了如下操作:
a.在父目录(即TEST1)所在簇(即3号簇)上建立新的目录项,存储TEST11文件夹信息。
b.分配一个新簇(应该是4号簇),给新建的文件夹(即TEST11)建立两个目录项:父目录和当前目录。
c.在FDT表中新分配的簇(应该是4号簇)对应的位置上写下文件结束符。
d.建立各部分的链路关系:新建文件夹(即TEST11)所对应的目录项的文件起始簇号字段写上新分配簇的簇号(应该是4号簇),,新簇上的两个目录项的文件起始簇号字段分配写上父目录所在簇号(3号簇)和当前簇号(应该是4号簇)。
新建TEST11文件夹后FDT变成:
根目录没有变化:
3号簇变成:
新分配4号簇:
显然我们的估计没有错的,也进一步证明我们前面的分析是正确的。
下面我们再分析建立文件的情况
我们先建立一个100字节的文件TEST.TXT,然后把这个文件拷贝到U盘的根目录下,FDT变成如下:
根目录变成:
新分配5号簇保存文件内容:
从上面的变化可以直观的看出,系统新建文件和新建文件夹所完成的操作是一样一样的:
a.在父目录所在簇上建立新的目录项,存储当前所建文件信息。
b.分配一个新簇,存储新建的文件的内容。
c.在FDT表中新分配的簇对应的位置上写下文件结束符。
d.建立链路关系:新建文件所对应的目录项的文件起始簇号字段写上新分配簇的簇号。
结束总结:
1.在FAT32文件系统中,目录和文件的存储采用统一的方式。
2.文件系统的操作的单位是簇,每新建立一个文件或文件夹,至少会重新分配一个簇号。
3.如果一个文件或目录的内容要多个簇才能存储得下,则系统会分配多个簇来存储文件或目录的内容
4.当需要多个簇时,这些簇可能连续也可能不连续,但无论是连续或是不连续,系统都是采用FDT链表的形式来组织的。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
文件系统基础知识之磁盘-曾德标-ChinaUnix博客
http://blog.chinaunix.net/uid-26913704-id-3213957.html
分类: WINDOWS
磁盘的物理结构
一个磁盘驱动器两个主要的移动部件;一个是磁盘片组合(disk assembly) ,另一个是磁头组合(head assembly)。磁盘片组合由一个或多个圆盘(platter)组成,它们围绕着一根中心主轴旋转。圆盘的上表面和下表面涂覆了一薄层磁性材料,二进制位被存储在这些磁性材料上。其中,0和1在磁材料中表现为不同的模式。
磁盘被组织成磁道(track),磁道是单个盘片上的同心圆。所有盘面上半径相同的磁道构成了柱面(cylinder),从磁盘的顶视图可以看到,磁道占据大部分盘面,最靠近主轴的区域除外。沿着磁道的数据密度大于沿着半径的数据密度。在2008年,一个典型的磁盘上每英寸有大约100 000个磁道,但是沿着磁道每英寸能够存储100万个二进制位。
磁道被组织成扇区(sector)。扇区是被间隙(gap)分割的圆的片段,间隙未被磁化为0或1
虽然图片中显示每一个磁道有相同的扇区数,但实际上,每个磁道的扇区数通常是不同的,靠外圈磁道的扇区数比靠内圈磁道的扇区数多。就读写磁盘而论,扇区是不可分割的单位;就磁盘错误而论,它也是一个不可分割的单位。倘若一部分磁化层被以某种方式损坏,以至于它不再能存储信息,那么那些包含这个部分的整个扇区也不能再使用。间隙大约占整个磁道的10%,用于帮助标识扇区的起点。通常,在磁盘与主存之间所传输数据的逻辑单元称为块,其由一个或多个扇区所组成。
第二个可移动部件是磁头组合,它承载着磁头。每一个盘面有一个磁头,它极其贴近地悬浮在盘面上,但是绝对不与盘面接触(否则就要发生“头损毁”,盘片被破坏)。磁头读出经过它下面的盘面的磁方向,也能改变其磁方向,以便在磁盘上写信息。每个磁头被固定在一个磁头臂上,所有盘面的磁头随着磁头臂一同移进移出,磁头臂是固定的磁头组合的一部分。
很显然,计算整个磁盘的容量的算法是:盘面数X磁道数X扇区数X扇区字节数
磁盘的逻辑结构
要组织磁盘上存储的数据,使得可以方便的存储和访问,就要实现数据的定位。数据的定位主要有两种方式:CHS地址和LBA线性地址。
CHS地址
早期硬盘存储空间采用3维地址结构描述:
C=Cylinder(柱面。若干盘体重叠,相同的磁道(track上)构成的一个立面体)
H=Head(磁头。一张盘有两面(side),每面一个磁头)
S=Sector(扇区。盘体上的圆形轨迹为磁道,把磁道等分为若干存储区域)
磁盘的容量=柱面总数×磁头总数×每道扇区总数×每扇区容量(512byte)
LBA地址
LBA是逻辑块地址的简称,它是一种线性地址结构,它其实是由CHS计算的扇区编号顺序编址,即0柱0面1扇区为LBA 0扇区。现在的硬盘厂家为了保持兼容性,仍然提供了虚拟的CHS参数,可在BIOS设置中看到。对硬盘的数据访问是靠系统调用INT 13H中断程序实现的,它将欲访问的数据地址传递给硬盘接口电路(ATA接口)完成读写操作。
528MB的限制:早期的硬盘的CHS参数被限制为:磁头数最大16,柱面数最大1024,扇区最大63,每扇区字节数为512字节。因此1024×16×63×512B≈528MB。
8GB容量限制:将柱面数增加到16384,其他不变,共计24bit,则硬盘容量最大为:16384×16×63×512B≈8.4GB。
32GB容量限制:硬盘采用了虚拟CHS值,使得柱面数为65535,其他不变,共计26bit,这样,磁盘的总容量最大为: 65535×16×63×512B≈32GB。
137G 容量限制:由于普遍使用了LBA寻址模式和虚拟CHS参数,将扇区数进一步增加为255,共计28位,将其乘积作为LBA值。这样系统使用28位的LBA参数,约计137GB。
磁盘的存储结构
刚刚从厂商处购来的新硬盘既无任何数据,也不能写入任何数据,必须先进行低级格式化,FDISK 分区,FORMAT 高级格式化后方可使用。对硬盘的这一系列初始化工作,称之为硬盘准备。过程如下:低级格式化---------------FDISK 分区-------------------FORMAT 高级格式化。
(1)低级格式化:磁盘为了达到随机存取的目的,需要在磁盘上划分出磁道,然后又在磁道划分出扇区,每个扇区以扇区间隙、同步引导字节和扇区编号作为扇区的起始,然后才是扇区的内容,后面还有校验标记。计算机就是凭借这些标记信息来识别扇区的。低级格式化就是在磁道上标上这些标记而已。所以低级格式化的操作实际上仅仅是一个简单的写过程,写的不是数据而是标记。同时低级格式化还会剔出坏磁道。
(2)FDISK分区:允许整个物理硬盘在逻辑上划分成最多4个主分区(其中可以有一个扩展分区),以实现多个操作系统共享硬盘空间。在建立了扩展分区的前提下,可以将扩展分区划分成一个或多个逻辑分区。在硬盘上建立分区表的同时,FDISK 会把主引导记录MBR 写到硬盘的主引导记录(柱面0,磁头0,扇区1),并激活一个用户指定的主分区。下面要特别介绍一下主引导记录MBR :
MBR 称为硬盘主引导记录。它是在分区时由FDISK 建立在硬盘柱面0,磁头0,扇区1 上的,总共占用512 个字节,包括一小段执行代码(主引导代码)、磁盘特征和硬盘分区表。主引导记录(以及后面介绍的引导扇区)结束的两个字节必须是引导自举标记0x55AA。磁盘特征位于0x01B8, 指定磁盘操作系统。
主引导代码实现下列功能: a. 扫描分区表查找活动分区; b. 寻找活动分区的起始扇区; c. 将活动分区的引导扇区读到内存; d. 执行引导扇区的运行代码。 如果主引导代码未完成这些功能, 系统会显示下列的错误信息之一: Invalid partition table, Error loading operating system, Missing operating system.
主引导记录MBR 由4 个部分组成:a.主引导程序(偏移地址0000H~0088H),它负责从活动分区中装载并运行系统引导程序;b.出错信息数据区(偏移地址0089~00E1 为出错信息,10E2H~10BD 全为0 字节); c.分区表(DPT,Disk Partition Table,含4 个分区项,偏移地址01BEH~01FDH,每个分区表项长16 个字节,共64 字节),即主分区和扩展分区的信息;d.结束标志(偏移地址01EFH~01FFH ),这两个字节值为结束标志55AA,如果该标志错误系统就不能启动.
注意:硬盘的引导记录是不属于任何一个操作系统的,它先于所有的操作系统而被调入内存并发挥作用,然后才将控制权交给主分区内的操作系统,并让主分区信息表来管理硬盘。
(3)高级格式化:
这一步之前的所有操作,都是与具体的文件系统没有任何关系的,从现在开始,才涉及到具体的文件系统,换句话说,高级格式化是与我们要建立的文件系统相关的,因此我们调用高级格式化命令时,文件类型是必须提供的参数之一。
在DOS/WINDOWS系统中,用FORMAT对指定分区进行高级格式化,将分区空间划分逻辑扇区,生成DOS 引导扇区(即逻辑0 扇区)DBR,文件分配表FAT 和根文件目录表FDT。
在LINUX系统中,需要使用mkfs命令将分区进行格式化,建立想要的文件系统,如EXT2,EXT3,等。
经过以上三步后,磁盘的存储结构看起来如下图所示: