FAT初步认识
来源:互联网 发布:php msgpackunpack 编辑:程序博客网 时间:2024/06/07 03:33
C++的课,老师把数据和机组和C++都串连起来了,好棒!
讲动态变量,讲到new和malloc,delete和free,它们的相似与不同;
FAT的原理我大概听到的是:有这样一个表格,存储要访问数据的地址,有了首地址,就可以依照链表的结构去依次查询到下一个数据的地址,进而去磁盘上访问。
于是不禁产生一些疑问出来,那这样的表格是动态生成的喽?还是说第一次访问时动态地生成表格,后面再要访问,就依照第一次生成的这个表格去访问磁盘,这样就能够提高访问磁盘的效率?哦,难道是在往磁盘里存数据的时候,就已经把这么一个表格生成并且还保存了,第一次访问,就已经是按照这个表格来的?恩,这样似乎还能想得通~
自己去上网查找了FAT的资料,太复杂了,看不大懂诶!只好先就这样想喽~
附:
文件配置表(英文:File Allocation Table,首字母缩略字:FAT)是一种由微软发明的并带有部分专
飞客数据恢复中心提供
设计
[编辑]主磁盘结构
主启动区文档分配表#1文档
分配表#2根目录其他所有数据...
剩下磁盘空间
一个FAT文件系统包括四个不同的部分。
- 保留扇区,位于最开始的位置。第一个保留扇区是引导区(分区启动记录)。它包括一个称为基本输入输出参数块的区域(包括一些基本的文件系统信息尤其是它的类型和其它指向其它扇区的指针),通常包括操作系统的启动调用代码。保留扇区的总数记录在引导扇区中的一个参数中。引导扇区中的重要信息可以被DOS和OS/2中称为驱动器参数块的操作系统结构访问。
- FAT区域。它包含有两份文档分配表,这是出于系统冗余考虑,尽管它很少使用,即使是磁盘修复工具也很少使用它。它是分区信息的映射表,指示簇是如何存储的。
- 根目录区域。它是在根目录中存储文档和目录信息的目录表。在FAT32下它可以存在分区中的任何位置,但是在早期的版本中它永远紧随FAT区域之后。
- 数据区域。这是实际的文档和目录数据存储的区域,它占据了分区的绝大部分。通过简单地在FAT中添加文档链接的个数可以任意增加文档大小和子目录个数(只要有空簇存在)。然而需要注意的是每个簇只能被一个文档占有,这样的话如果在32KB大小的簇中有一个1KB大小的文档,那么31KB的空间就浪费掉了。
[编辑]启动扇区
格式如下
IBM 3.3
(在“IBM”和“3.3”之间有两个空格)和MSDOS5.0
.0x0b2每个扇区的字节数。基本输入输出系统参数块从这里开始。0x0d1每簇扇区数0x0e2保留扇区数(包括启动扇区)0x101文档分配表数目0x112最大根目录条目个数0x132总扇区数(如果是0,就使用偏移0x20处的4字节值)0x151介质描述0xF8单面、每面80磁道、每磁道9扇区0xF9双面、每面80磁道、每磁道9扇区0xFA单面、每面80磁道、每磁道8扇区0xFB双面、每面80磁道、每磁道8扇区0xFC单面、每面40磁道、每磁道9扇区0xFD双面、每面40磁道、每磁道9扇区0xFE单面、每面40磁道、每磁道8扇区0xFF双面、每面40磁道、每磁道8扇区同样的介质描述必须在重复复制到每份FAT的第一个字节。有些操作系统(MSX-DOS 1.0版)全部忽略启动扇区参数,而仅仅使用FAT的第一个字节的介质描述确定文件系统参数。
0x162每个文档分配表的扇区(FAT16)0x182每磁道的扇区0x1a2磁头数0x1c4隐藏扇区0x204总扇区数(如果超过65535,参见偏移0x13)0x244每个文档分配表的扇区(FAT32)。扩展基本输入输出系统参数块从这里开始。0x241物理驱动器个数(FAT16)0x251当前磁头(FAT16)0x261签名(FAT16)0x274ID(FAT16)0x282Flags(FAT32)0x2a2版本号(FAT32)0x2c4根目录启始簇(FAT32)0x2b11卷标(非FAT32)0x302FSInfo扇区(FAT32)0x322启动扇区备份(FAT32)0x3412保留未使用(FAT32)0x368FAT文件系统类型(如FAT、FAT12、FAT16)0x3e2操作系统自引导代码0x401BIOS设备代号(FAT32)0x411未使用(FAT32)0x421标记(FAT32)0x434卷序号(FAT32)0x4711卷标(FAT32)0x528FAT文件系统类型(FAT32)0x1FE2扇区结束符(0x55 0xAA)这里描述的启动扇区能在如OS/2 1.3的启动盘上看到。早期的版本使用一个较短的基本输入输出系统参数块,它们的启动代码在前面开始(如OS/2 1.1中是偏移0x2b)。
[编辑]例外情况
Apricot PC的MS-DOS所用FAT的实现有一个不同的启动扇区组织以使用计算机与IBM不兼容的基本输入输出系统。跳转指令和OEM名被省略并且MS-DOS文件系统参数位于0x50(在标准扇区中偏移为0x0B - 0x17)。后来的Apricot MS-DOS版本除了Apricot特有的引导区之外也具有了读写标准启动分区的能力。
BBC Master 512上的DOS Plus根本就不使用传统的引导区。数据磁盘省略了引导区并且以一个单份的FAT开始(FAT的第一个字节用来确定磁盘容量),启动磁盘使用一个包含启动调用程序的小型ADFS文件系统,后面跟随一个单份的FAT。
[编辑]文档分配表
一个分区分成同等大小的簇,也就是连续空间的小块。簇的大小随着FAT文件系统的类型以及分区大小而不同,典型的簇大小介于2KB到32KB之间。每个文档根据它的大小可能占有一个或者多个簇;这样,一个文档就由这些这些(称为单链表)簇链所表示。然而,这些链并不一定一个接着一个在磁盘上存储,它们经常是在整个数据区域零散的储存。
文档分配表(FAT)是映射到分区每个簇的条目列表。每个条目记录下面五种信息中的一种。
- 链中下一个簇的地址
- 一个特殊的文档结束符(EOF)符号指示链的结束
- 一个特殊的符号标示坏簇
- 一个特殊的符号标示保留簇
- 0来表示空闲簇
每个版本的FAT文件系统使用不同大小的FAT条目。这个大小已经由名字表示出来,例如FAT16文件系统的每个条目使用16位表示,32位文件系统使用32位表示。这个不同意味着FAT32系统的文档分配表能比FAT16映射更多的簇,它也允许FAT32有更大的分区大小。这也使得FAT32比FAT16更能有效地利用磁盘空间,因为每个驱动器能够寻址更小的簇,这也就意味着更少的空间浪费。
FAT条目值:
注意FAT32只使用32位中的28位。高4位通常是0但它们是保留位,不要更改它们。在上面的表中它们用问号表示。
[编辑]目录表
目录表是一个表示目录的特殊类型文档(现今通常称为文件夹)。它里面保存的每个文档或目录使用表中的32位条目表示。每个条目记录名字、扩展名、属性(档案、目录、隐藏、只读、系统和卷)、创建的日期和时间、文档/目录数据第一个簇的地址,最后是文档/目录的大小。
除了FAT12和FAT16文件系统中的根目录表占据特殊的根目录区域位置之外,所有其它的目录表都存在数据区域。
合法的DOS文件名包括下面一些字符:
- 大写字母A-Z
- 数字0-9
- 空格(尽管结尾的空格被作为填充而不是文件名的一部分)
- ! # $ % & ( ) - @ ^ _ ` { } ~ '
- 数值128-255
DOS文件名位于OEM字符集。
位于根目录区域和子目录区域的目录条目都是下面的格式:
第一个字节可以是下面的特殊数值:
0x00这个条目有用并且后面没有被占用条目0x05最初字符确实是0xE50x2E'点'条目;'.'或者'..'0xE5这个条目曾经被删除不再有用。取消删除文档工具作为取消删除的一步必须使用一个正常的字符取代它。0x083DOS文件扩展名(空格补齐)0x0b1文档属性第一个字节可以是下面一些特殊值:
属性值0x0F用来表示长文件名条目。
0x0c1保留,NT使用(参见后面)0x0d1创建时间,最小时间分辨率:10ms单位,数值从0到199。0x0e2创建时间。小时、分钟和秒根据后面的图示描述进行编码:注意秒只保存了2秒的分辨率。更细分辨率的文档创建时间在偏移0x0d处。
0x102创建日期。年、月和日根据后面的图示编码:长文件名(LFN)使用一个技巧存储在FAT文件系统上——在目录表中添加假的条目。这些条目使用一个普通文档无法使用的卷标属性标识,普通文档无法使用是由于它们被大多数旧的MS-DOS程序忽略。很显然,一个只包含卷标的目录被当作空卷,这样就允许删除;使用长文件名创建的文档在从普通的DOS删除就会发生这样的情形。
校验和也允许检验长文件名是否与8.3文件名匹配;当一个文档删除之后使用DOS在同一个目录位置重新创建之后就会出现不匹配现象。校验和使用下面的算法计算。(注意pFcbName是指向如正常目录条目中所显示的文件名的指针,例如前八个字符是文件名,最后三个是扩展名。点是隐含的。文件名中没有使用的空间将使用空格(ASCII 0x20)补齐。例如,“Readme.txt”将记录为"README TXT"。
unsigned char lfn_checksum (const unsigned char *pFcbName){ int i; unsigned char sum=0; for (i=11; i; i--) sum = ((sum & 1) ? 0x80 : 0) + (sum >> 1) + *pFcbName++; return sum;}
旧版的PC-DOS错误地将根目录中的长文件名当作卷标,这样它们就会显示错误的卷标。
每个假条目包含13UTF-16个字符(26字节),通过使用包含文档大小或者时间记录的区域获得除了旧的8+3之外的另外15个字节(但是出于安全和磁盘检查工具的考虑开始簇的区域没有使用保留值为0)。参见8.3中另外的解释。
长文件名条目使用下面的格式:
如果一个文件名只包含小写字母、或者是一个小写字母的名加上大写扩展名的混合或者与此相反,没有特殊的字符并且满足8.3的限制,在视窗NT上就不创建VFAT的条目。相反,在目录条目的偏移0x0c处的没有说明的位用来指示文件名全部或者部分是小写字母。特别明确的是,位4意味着小写字母的扩展名,位3意味着名是小写字母,这样就允许如“example.TXT”和“HELLO.txt”这样的组合,但是不允许“Mixed.txt”这样的组合。很少有操作系统支持这种功能。非NT视窗版本当这个扩展使用时将把文件名当作大写字母。缺省情况下,Linux的最近版本将认识这个扩展但是在写时并不使用它。
[编辑]第三方扩展
在微软公司添加长文件名和创建/访问时间戳之前,其它的操作系统使用目录表字节0x0C-0x15存储其它的元数据。它们包括:
[编辑]
- FAT初步认识
- IBM AIX初步认识
- 指针的初步认识!
- 初步认识Struts
- ARCSDE初步认识
- ajax初步认识
- 初步认识 JSON
- 初步认识JFreeChart
- Oracel初步认识
- 初步认识Irr引擎
- Struts初步认识
- openlayers 初步认识
- JavaScript 认识初步..
- 网络爬虫初步认识
- 反射初步认识
- 银行卡初步认识
- Ajax初步认识
- 初步认识Maven2
- Linux curl使用简单介绍
- Android手机进程意外停止的解决办法
- 宝马推出危险警告系统,可提前告知危险
- Android 2.2手动开启APP2SD方法
- Android手机指令大全
- FAT初步认识
- 著名密码破解利器John the Ripper使用方法详解
- Android手机IMEI指令大全
- Java Annotation入门
- Android手机变砖后的自救方法
- JS日历控件
- 工程路径首字母大写导致tomcat工程无法访问的问题(工程在tomcat里面发布后,在应用列表里面可以看见,但是无法访问)
- 使用Android手机注意事项
- Get “android:layout_height” from `AttributeSet` in a custom view constructor