一、FAT文件系统分为四个部分

参考别人的博客

1.http://blog.163.com/ourhappines@126/blog/static/121363154201311811495492/

  1. 保留扇区(引导区)

最开始的位置,第一个保留扇区是引导区。包括基本的文件系统信息,比如它的类型和其它指向其它扇区的指针。通常包括操作系统启动调用代码。保留扇区的总数记录在引导扇区中的一个参数中。

  1. FAT区(文件分配表)

包含两份文件分配表,分区信息的映射表,指示簇是如何存储的。

  1. 根目录区

在根目录中存储文件和目录信息的目录表。

  1. 数据区域

实际文件和目录数据存储的区域。需要注意的是每个簇只能被一个文件占有。

主引导记录(主引导扇区),读设备时最开始读这个分区。

  1. MBR(master boot record)MBR 又称作主引导记录占用 Boot Sector 的前 446 个字节 ( 0 to 0x1BD ), 存放系统主引导程序 (它负责从活动分区中装载并运行系统引导程序).
  2. DPT 即主分区表占用 64 个字节 (0x1BE to 0x1FD), 记录了磁盘的基本分区信息,主分区表分为四个分区项,,每项 16 字节,分别记录了每个主分区的信息(因此最多可以有四个主分区).
  3. Boot      Record ID 即引导区标记占用两个字节 (0x1FE      and 0x1FF), 对于合法引导区,它等于 0xAA55,这是判别引导区是否合法的标志。

二、主引导扇区(MBR)的具体结构如下图所示:

Offset

Description

Size

000h

Executable Code (Boots Computer)

446 Bytes

1BEh

1st Partition Entry (See Next Table)

16 Bytes

1CEh

2nd Partition Entry

16 Bytes

1DEh

3rd Partition Entry

16 Bytes

1EEh

4th Partition Entry

16 Bytes

1FEh

Executable Marker (55h AAh)

2 Bytes

USB hound 得到的数据

512  IN     fa 31 c0 8e  d8 8e c0 8e  d0 bc 00 7c  fb fc 89 e6  .1..............        55.1.0(2)

bf 00 06 b9  00 01 f3 a5  ea dc 06 00  00 10 00 01  ................        55.1.16

00 00 7c 00  00 00 00 00  00 00 00 00  00 80 3f 00  ..............?.        55.1.32

ff 00 b4 03  1e 0e 1f 3a  16 10 00 74  06 1f ea 36  .......:...t...6        55.1.48

e7 00 f0 3d  fb 54 75 05  8c d8 fb eb  1d 80 fc 08  ...=.Tu.........        55.1.64

75 1b e8 81  00 8a 36 13  00 fe ce 8b  0e 15 00 86  u.....6.........        55.1.80

cd c0 e1 06  0a 0e 11 00  31 c0 f8 eb  65 80 fc 02  ........1...e...        55.1.96

72 cb 80 fc  04 77 c6 60  80 cc 40 50  be 00 00 c7  r....w.`..@P....        55.1.112

04 10 00 30  e4 89 44 02  89 5c 04 8c  44 06 66 31  ...0..D..\..D.f1        55.1.128

c0 66 89 44  0c 88 f0 f6  26 11 00 88  cf 88 eb c0  .f.D....&.......        55.1.144

ef 06 81 e1  3f 00 01 c8  48 89 c7 a1  13 00 f7 26  ....?...H......&        55.1.160

11 00 f7 e3  01 f8 81 d2  00 00 89 44  08 89 54 0a  ...........D..T.        55.1.176

58 30 c0 8a  16 10 00 e8  0c 00 88 26  03 00 61 a1  X0.........&..a.        55.1.192

02 00 1f ca  02 00 9c ff  1e 22 00 c3  80 fa 8f 7f  ........."......        55.1.208

04 88 16 2d  06 be 87 07  e8 8d 00 be  be 07 31 c0  ...-..........1.        55.1.224

b9 04 00 f6  04 80 74 03  40 89 f5 81  c6 10 00 e2  ......t.@.......        55.1.240

f2 48 74 02  cd 18 bf 05  00 be 1d 06  c7 44 02 01  .Ht..........D..        55.1.256

00 66 8b 46  08 66 89 44  08 b8 00 42  8a 16 2d 06  .f.F.f.D...B..-.        55.1.272

cd 13 73 0d  4f 74 49 30  e4 8a 16 2d  06 cd 13 eb  ..s.OtI0...-....        55.1.288

d8 a1 fe 7d  3d 55 aa 75  37 fa 66 a1  4c 00 66 a3  ....=U.u7.f.L.f.        55.1.304

3f 06 be 13  04 8b 04 48  89 04 c1 e0  06 8e c0 31  ?......H.......1        55.1.320

ff be 1d 06  b9 60 00 fc  f3 a5 c7 06  4c 00 17 00  .....`......L...        55.1.336

a3 4e 00 fb  8a 16 2d 06  89 ee fa ea  00 7c 00 00  .N....-.........        55.1.352

be aa 07 e8  02 00 eb fe  ac 20 c0 74  09 b4 0e bb  ......... .t....        55.1.368

07 00 cd 10  eb f2 c3 53  74 61 72 74  20 62 6f 6f  .......Start boo        55.1.384

74 69 6e 67  20 66 72 6f  6d 20 55 53  42 20 64 65  ting from USB de        55.1.400

76 69 63 65  2e 2e 2e 0d  0a 00 42 6f  6f 74 20 66  vice......Boot f        55.1.416

61 69 6c 65  64 00 00 00  ea eb d4 ca  00 00 00 00  ailed...........        55.1.432  第一分区

硬盘分区表  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  ................        55.1.448  第二分区

00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  ................        55.1.464  第三分区

00 00 00 00  00 00 00 00  00 00 00 00  00 00 80 04  ................        55.1.480  第四分区

05 00 0b fe  ff b3 00 01  00 00 80 8c  e8 00 55 aa  ..............U.        55.1.496

过256扇区后是这个分区       *512byte=7.2G

硬盘分区表

地址

字节数

描述

00~00

1

可引导标志0x00不可引导,0x80可引导

01~03

3

分区起始CHS地址

04~04

1

分区类型

05~07

3

分区结束CHS地址

08~0B

分区起始LBA地址

0C~0F

分区大小扇区数

分区起始CHS地址(U盘可以直接根据扇区,簇来寻址。就不用考虑了)

第一字节用于记录分区起始磁头号,第二字节低六位用于记录分区起始扇区号,用10bit记录分区起始柱面号:第二个字节的高两位作为起始柱面的高两位,第三个字节作为分区起始柱面的低八位。

三、DBR分区,读文件系统时最开始读这个分区。

winhex 读取的数据

【1】0x00~0x02:3 个字节,跳转指令。
【2】0x03~0x0A:8 个字节,文件系统标志和版本号,这里为 MSDOC5.0。

【3】0x0B~0x0C:2 个字节,每扇区字节数,512(0X02 00)。
【4】0x0D~0x0D:1 个字节,每簇扇区数,8(0x08)。
【5】0x0E~0x0F:2 个字节,保留扇区数,2272(0x08 E0)。 加上256(MBR分区)=2528。FAT分区表从逻辑地址2528扇区开始
【6】0x10~0x10:1 个字节,FAT 表个数,2。
【7】0x11~0x12:2 个字节,根目录最多可容纳的目录项数,FAT12/16 通常为 512。FAT32 不使用此处值,
置 0。
【8】0x13~0x14:2 个字节,扇区总数,小于 32MB 时使用该处存放。超过 32MB 时使用偏移 0x20~0x23 字
节处的 4 字节存放。笔者的 SD 卡容量为 2GB,所以不使用该处,置 0.
【9】0x15~0x15:1 个字节,介质描述符,0xF8 表示本地硬盘。
【10】0x16~0x17:2 个字节,每个 FAT 表的大小扇区数(FAT12/16 使用,FAT32 不使用此处,置 0)。
【11】0x18~0x19:2 个字节,每磁道扇区数,63(0x00 3F)。
【12】0x1A~0x1B:2 个字节磁头数,255(0x00 FF)。
【13】0x1C~0x1F:4 个字节,分区前已使用扇区数,63(0x00 00 00 3F)。保留区,数据地址要加上这个。

这个数据就是相对于 MBR的地址偏移量,MBR 的扇区地址才是整个U盘(SD卡)的物理扇区号为 0 的那个地址,也就是说文件系统并不是处在整个 U盘(SD) 卡最开始的地方,它处在 MBR所处的保留区之后。U盘批量传输数据时,地址是逻辑扇区地址。

【14】0x20~0x23:4 个字节,文件系统大小扇区数,15646657(0x 00 EEBF C1)。
【15】0x24~0x27:4 个字节,每个 FAT 表的大小扇区数,15248(0x 00 00 3B 90)。 7.4M


【16】0x28~0x29:2 个字节,标记。
【17】0x2A~0x2B:2 个字节,版本号。
【18】0x2C~0x2F:4 个字节,根目录簇号,2。(虽然在 FAT32 文件系统下,根目录可以存放在数据区的任
何位置,但是通常情况下还是起始于 2 号簇)
【19】0x30~0x31:2 个字节,FSINFO(文件系统信息扇区)扇区号,1。(上图的标注即用黄色条纹的标注
有误,请读者注意)该扇区为操作系统提供关于空簇总数及下一可用簇的信息。
【20】0x32~0x33:2 个字节,备份引导扇区的位置,6。(上图的标注即用黄色条纹的标注有误,请读者注
意)备份引导扇区总是位于文件系统的 6 号扇区。
【21】0x34~0x3F:12 个字节,未使用。
【22】0x40~0x40:1 个字节,BIOS INT 13H 设备号,0x80。(这个我也不知道什么意思☺)
【23】0x41~0x41:1 个字节,未用。
【24】0x42~0x42:1 个字节,扩展引导标志。0x29。
【25】0x43~0x46:1 个字节,卷序列号。通常为一个随机值。
【26】0x47~0x51:11 个字节,卷标(ASCII 码),如果建立文件系统的时候指定了卷标,会保存在此。笔
者当时没有指定卷表,上图中的 YCY 是后来指定的。
【27】0x52~0x59:8 个字节,文件系统格式的 ASCII 码,FAT32。
【28】0x5A~0x1FD:410 个字节,未使用。该部分没有明确的用途。
【29】0x1FE~0x1FF:签名标志“55 AA”。

四、文件分配表FAT

  位于保留区后的是 FAT 区,有两个完全相同的 FAT(File Allocation Table, 文件分配表)表组成。

1.  FAT32 中每个簇的簇地址,是有 32bit(4 个字节)记录在 FAT 表中。FAT 表中的所有字节位置以4 字节为单位进行划分,并对所有划分后的位置由 0 进行地址编号。0 号地址与 1 号地址被系统保留并存储特殊标志内容。从 2 号地址开始,每个地址对应于数据区的簇号,FAT 表中的地址编号与数据区中的簇号相同。我们称 FAT 表中的这些地址为 FAT 表项,FAT 表项中记录的值称为 FAT表项值。
2.  当文件系统被创建,也就是进行格式化操作时,分配给 FAT 区域的空间将会被清空,在 FAT1 与FAT2 的 0 号表项与 1 号表项写入特定值。由于创建文件系统的同时也会创建根目录,也就是为根目录分配了一个簇空间,通常为 2 号簇,所以 2 号簇所对应的 2 号 FAT 表项也会被写入一个结束标记。

3.  如果某个簇未被分配使用,它所对应的 FAT 表项内的 FAT 表项值即用 0 进行填充,表示该 FAT 表项所对应的簇未被分配。

4.  当某个簇已被分配使用时,则它对应的 FAT 表项内的 FAT 表项值也就是该文件的下一个存储位置的簇号。如果该文件结束于该簇,则在它的 FAT 表项中记录的是一个文件结束标记,对于 FAT32而言,代表文件结束的 FAT 表项值为 0x0FFFFFFF。
5.  如果某个簇存在坏扇区,则整个簇会用 FAT 表项值 0xFFFFFF7 标记为坏簇,不再使用,这个坏簇标记就记录在它所对应的 FAT 表项中。
6.  由于簇号起始于 2 号,所以 FAT 表项的 0 号表项与 1 号表项不与任何簇对应。FAT32 的 0 号表项值总是“F8FFFF0F”。如上图所示。
7.  1 号表项可能被用于记录脏标志,以说明文件系统没有被正常卸载或者磁盘表面存在错误。不过这个值并不重要。正常情况下 1 号表项的值为“FFFFFFFF”或“FFFFFF0F”。
8.  在文件系统中新建文件时,如果新建的文件只占用一个簇,为其分配的簇对应的 FAT 表项将会写入结束标记。如果新建的文件不只占用一个簇,则在其所占用的每个簇对应的 FAT 表项中写入为其分配的下一簇的簇号,在最后一个簇对应的 FAT 表象中写入结束标记。
9.  新建目录时,只为其分配一个簇的空间,对应的 FAT 表项中写入结束标记。当目录增大超出一个
簇的大小时,将会在空闲空间中继续为其分配一个簇,并在 FAT 表中为其建立 FAT 表链以描述它所占用的簇情况。
10.  对文件或目录进行操作时,他们所对应的 FAT 表项将会被清空,设置为 0 以表示其所对应的簇处于未分配状态。

五、根目录(数据区的第一簇)

定位一个 FAT32 文件系统的数据起始处,可以通过引导扇区的相关参数计算出来。

1.从引导扇区的偏移 0x0E~0x0F 字节处得到保留扇区。

2.从偏移 0x10 字节处得到 FAT 表的个数。

3.从偏移 0x24~0x27 字节处得到每个 FAT 表的大小扇区数。

4.利用如下公式计算:
保留扇区数 + 每个 FAT 表大小扇区数 × FAT 表个数 = 数据区起始扇区号

256+2272+15248*2=33024

计算其他已知簇号的扇区号,还要由引导扇区的偏移 0x0D 字节处查找到每个簇大小扇区数,并使用如下公式计算:
某簇起始扇区号 = 保留扇区数 + 每个 FAT 表大小扇区数 × FAT 表个数 + (该簇簇号 - 2) × 每簇扇区数

根目录在文件系统建立时即已被创建,其目的就是存储目录(也称文件夹)或文件的目录项。每个目录项的大小为 32 个字节

卷标Kingston

接下来是子目录

前两个目录表项 是当前目录(.)和父目录 ( .. )

下面开始介绍目录项(短文件名目录项)

如果文件名不足 8 个字符,用 0x20 进行填充。
  超过 8 个字符时则会被截短,因为短文件名目录项中没有足够的空间记录超出的部分。截短的方法是取文件名的前 6 个字符加上“~1”(如果有同名文件,则会依次递增该数值),然后加上其扩展名。
  如果是子目录,则将扩展名部分用“0x20”进行填充。
为了解决长文件名的问题,FAT 文件系统又增加了一种“长文件名”目录项结构。其从 windows95 开始,不管文件名的长度是否超过 8 个字符,都会同时为其创建短文件名目录项和长文件名目录项,因为短文件名不区分大小写,而长文件名则是区分大小写的。

具体解释如下:
【1】0x00~0x00:1 个字节,如果该目录项正在使用中,则为文件名或子目录名的第一个字符。
  0x00:说明该目录项未被分配使用。
  0xE5:说明该目录项曾经被使用过,但是现在已被删除。目前处于未分配状态
【2】0x01~0x0A:10 个字节,文件名的第 2 至第 11 个 ASCII 码,除扩展名外,如果文件的名字不足 8个字符则用 0x20 进行填充。
【3】0x0B~0x0B:1 个字节,所描述文件的属性
  0x01-只读
  0x02-隐藏
  0x04-系统文件
  0x08-卷标
  0x0F-为此值时表示该目录项为长文件名目录项
  0x10-目录
  0x20-存档
【4】0x0C~0x0C:1 字节,保留
【5】0x0D~0x0D:1 个字节,文件穿件的时间,精确到创建时刻的十分之一秒
【6】0x0E~0x0F:2 个字节,文件创建的时间——时分秒 两个字节的 16bit 被划分为 3 个部分:
  0~4bit 为秒,以 2 秒为单位,有效值为 0~29,可以表示的时刻为 0~58
  5~10bit 为分,有效值为 0~59
  11~15bit 为时,有效值为 0~23

【7】0x10~0x11:2 个字节,文件创立的日期,16bit 也划分为三个部分:
  0~4bit 为日,有效值为 1~31
  5~10bit 为月,有效值为 1~12
  11~15bit 为时,有效值为 0~127,这是一个相对于 1980 年的年数值,也就是说该值加上 1980即为文件创建的日期值。该部分笔者就不再举例就计算了,原理和计算创建时间是一样的。请读者自己去计算。 
【8】0x12~0x13:2 个字节,最后访问日期。
【9】0x14~0x15:2 个字节,文件起始簇号的高两个字节。
【10】0x16~0x17:2 个字节,文件最后修改的时间。

【11】0x18~0x19:2 个字节,文件最后被修改时的日期。
【12】0x1A~0x1B:文件内容起始簇号的低两个字节,与 0x14~0x15 字节处的高两个字节组成文件内容起始簇号。
【13】0x1C~0x1F:文件内容大小字节数,只对文件有效,子目录的目录项此处全部设置为 0。

U盘FAT32文件系统的更多相关文章

  1. U盘FAT32文件系统转换成NTFS文件系统

    首先 点击-开始--运行---输入CMD ----输入convert X:/FS:NTFS 其中 X是U盘所在的盘符

  2. FAT32文件系统的存储组织结构(一)

    对磁盘的物理结构,逻辑结构和存储结构有了比较深入的了解后,我们来仔细探讨FAT32文件系统的存储组织结构.说到文件系统的组织结构,我们应该马上意识到,这指的是文件系统在同一个分区内的组织结构,在这个话 ...

  3. 为什么 UEFI 方式启动的 U 盘必须使用 FAT32 文件系统?

    如果你希望更刺激地安装 Windows,那么你需要了解很多 Windows 系统相关的问题. 为什么 UEFI 方式启动的 U 盘必须使用 FAT32 文件系统? 因为 NTFS 是 Windows ...

  4. FAT32文件系统--For TF卡

    1. TF卡空间是如何分配的? 下面以4GB TF卡为例,通过WinHex工具进行分析,其空间分配如下图所示: FAT32把目录当做文件来管理,所以没有独立的目录区,所有的文件目录项都是在数据区里面的 ...

  5. SD卡FAT32文件系统格式

    一.声明 1.本文来源和主旨 2.本文测试环境 二.SD卡FAT文件系统 1.SD卡FAT32文件系统的整体布局 2.FAT文件系统简介 ① 文件分配表 ② 目录项 三.DBR(DOS BOOT RE ...

  6. 移动存储卡仍然用FAT32文件系统的真相

    微软在2001年就为自家的XP系统的本地磁盘默认使用了NTFS文件系统,但是12年之后,市面上的USB可移动设备和SD卡等外置存储器仍然在用着FAT32文件格式,这是什么理由让硬件厂商选择过时的文件系 ...

  7. 使用hexdump追踪FAT32文件系统中的一个文件

    最近在看文件系统基础结构等知识,本来重点是想看EXT4文件系统,但是目前没有找到比较详细说明EXT4文件系统详细结构的,用EXT3的对应着找结果有点出入,在想是不是我用hexdump的参数有问题,于是 ...

  8. FAT32文件系统的存储组织结构(二)

    前面已经基于一个格式化的空U盘分析了一下FAT32文件系统存储的组织结构,下面我们从文件操作的角度来分析一下文件系统的运作机制.由于换了个U盘,所以仍然贴出刚格式化的空U盘的几个重要的数据区如下:   ...

  9. FAT32文件系统学习(3) —— 数据区(DATA区)

    FAT32文件系统学习(3) —— 数据区(DATA区) 今天继续学习FAT32文件系统的数据区部分(Data区).其实这一篇应该是最有意思的,我们可以通过在U盘内放入一些文件,然后在程序中读取出来: ...

随机推荐

  1. [ionic开源项目教程] - 第14讲 ionic解决跨域问题

    [ionic开源项目教程] 第14讲 使用jsonp解决跨域问题 相信很多朋友在开发中都会遇到以下这个问题. No 'Access-Control-Allow-Origin' header is pr ...

  2. hibernate4 二级缓存demo实例

    转载:http://blog.csdn.net/chaoowang/article/details/21236501 hibernate使用版本是:hibernate-release-4.3.4.Fi ...

  3. 戏(细)说Executor框架线程池任务执行全过程(上)

    一.前言 1.5后引入的Executor框架的最大优点是把任务的提交和执行解耦.要执行任务的人只需把Task描述清楚,然后提交即可.这个Task是怎么被执行的,被谁执行的,什么时候执行的,提交的人就不 ...

  4. HDU 2122 HDU Today【Floyd】

    题意:给出n条路,起点和终点,问最短距离 用map处理一下地名,再用floyd 可是不懂的是:为什么INF定义成0x7fffffff就输出一堆奇怪的东西,改成100000000就可以了 #includ ...

  5. [转] 判断html页是否滚动停止

    原文链接:http://www.phpernote.com/javascript-function/754.html 最近有个项目中遇到这样一个问题: 有一个用于展示数据的带滚动条的DIV块,业务需求 ...

  6. (六)6.14 Neurons Networks Restricted Boltzmann Machines

    1.RBM简介 受限玻尔兹曼机(Restricted Boltzmann Machines,RBM)最早由hinton提出,是一种无监督学习方法,即对于给定数据,找到最大程度拟合这组数据的参数.RBM ...

  7. UVa11582 Colossal Fibonacci Numbers!

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> us ...

  8. Maven加依赖包

    对于初学maven的人来说刚开始会有个困惑,那就是怎么知道依赖的jar的groupId和atrifactId是什么, 比如要依赖mybatis,会在pom.xml中配置如下: <dependen ...

  9. 【转】这些编程语言程序员工资最高!Java才第四

    原文网址:http://tech.hexun.com/2016-07-18/185009761.html 在众多行业中,程序员属于高薪职业.无论是在国外还是国内,程序员的薪金水平普遍高于其他行业的工作 ...

  10. 【转】Mac OS X开机启动Path had bad permissions错误解决方案

    原文网址:http://www.07net01.com/2015/07/884646.html 最近在安装mongodb的时候遇到了上述提示,在国内各大网站寻找解决方案无果,于是果断查看国外的网站,终 ...