zoukankan      html  css  js  c++  java
  • FAT32文件格式示例解析

    1.前言

    本文主要以一个示例来分析FAT32文件系统的格式,对FAT32文件系统的各个区域详细分析。

    2.FAT32文件系统典型分区

    3.FAT32文件系统示例

    按如下步骤在ubuntu下创建FAT32文件系统:

    1.chenbo@chenbo-ThinkPad-R61:~$ cd /tmp/

    2.创建文件test.img

    chenbo@chenbo-ThinkPad-R61:/tmp$ sudo dd if=/dev/zero of=test.img bs=512 count=80000

    3.创建FAT32文件系统

    chenbo@chenbo-ThinkPad-R61:/tmp$ sudo mkfs.vfat -F 32 test.img

    4.将test.img挂载在/mnt

    chenbo@chenbo-ThinkPad-R61:/tmp$ sudo mount test.img /mnt
    5.创建test1 test2 test3三个目录

    chenbo@chenbo-ThinkPad-R61:/mnt$ sudo mkdir test1 test2 test3

    6.在test1下创建test1-1   test1-1-1目录

    chenbo@chenbo-ThinkPad-R61:/mnt$ cd test1

    chenbo@chenbo-ThinkPad-R61:/mnt/test1$ sudo mkdir test1-1

    chenbo@chenbo-ThinkPad-R61:/mnt/test1$ cd test1-1/

    chenbo@chenbo-ThinkPad-R61:/mnt/test1/test1-1$ sudo mkdir test1-1-1
    7.创建hello.txt文件,写入内容,拷贝到test1/test1-1/test1-1-1下

    chenbo@chenbo-ThinkPad-R61:/tmp$ touch hello.txt

    chenbo@chenbo-ThinkPad-R61:/tmp$ echo you are my friend! > hello.txt

    chenbo@chenbo-ThinkPad-R61:/tmp$ sudo cp hello.txt /mnt/test1/test1-1/test1-1-1/

    8.执行完如上步骤后,通过hexdump查看文件系统内容

    chenbo@chenbo-ThinkPad-R61:/tmp$ sudo umount /mnt

    chenbo@chenbo-ThinkPad-R61:/tmp$ hexdump -C test.img

    00000000  eb 58 90 6d 6b 66 73 2e  66 61 74 00 02 01 20 00  |.X.mkfs.fat... .|
    00000010  02 00 00 00 00 f8 00 00  20 00 40 00 00 00 00 00  |........ .@.....|
    00000020  80 38 01 00 68 02 00 00  00 00 00 00 02 00 00 00  |.8..h...........|
    00000030  01 00 06 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    00000040  80 00 29 80 73 bc 92 4e  4f 20 4e 41 4d 45 20 20  |..).s..NO NAME  |
    00000050  20 20 46 41 54 33 32 20  20 20 0e 1f be 77 7c ac  |  FAT32   ...w|.|
    00000060  22 c0 74 0b 56 b4 0e bb  07 00 cd 10 5e eb f0 32  |".t.V.......^..2|
    00000070  e4 cd 16 cd 19 eb fe 54  68 69 73 20 69 73 20 6e  |.......This is n|
    00000080  6f 74 20 61 20 62 6f 6f  74 61 62 6c 65 20 64 69  |ot a bootable di|
    00000090  73 6b 2e 20 20 50 6c 65  61 73 65 20 69 6e 73 65  |sk.  Please inse|
    000000a0  72 74 20 61 20 62 6f 6f  74 61 62 6c 65 20 66 6c  |rt a bootable fl|
    000000b0  6f 70 70 79 20 61 6e 64  0d 0a 70 72 65 73 73 20  |oppy and..press |
    000000c0  61 6e 79 20 6b 65 79 20  74 6f 20 74 72 79 20 61  |any key to try a|
    000000d0  67 61 69 6e 20 2e 2e 2e  20 0d 0a 00 00 00 00 00  |gain ... .......|
    000000e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
    00000200  52 52 61 41 00 00 00 00  00 00 00 00 00 00 00 00  |RRaA............|
    00000210  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    000003e0  00 00 00 00 72 72 41 61  89 33 01 00 08 00 00 00  |....rrAa.3......|
    000003f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
    00000400  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    00000c00  eb 58 90 6d 6b 66 73 2e  66 61 74 00 02 01 20 00  |.X.mkfs.fat... .|
    00000c10  02 00 00 00 00 f8 00 00  20 00 40 00 00 00 00 00  |........ .@.....|
    00000c20  80 38 01 00 68 02 00 00  00 00 00 00 02 00 00 00  |.8..h...........|
    00000c30  01 00 06 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    00000c40  80 00 29 80 73 bc 92 4e  4f 20 4e 41 4d 45 20 20  |..).s..NO NAME  |
    00000c50  20 20 46 41 54 33 32 20  20 20 0e 1f be 77 7c ac  |  FAT32   ...w|.|
    00000c60  22 c0 74 0b 56 b4 0e bb  07 00 cd 10 5e eb f0 32  |".t.V.......^..2|
    00000c70  e4 cd 16 cd 19 eb fe 54  68 69 73 20 69 73 20 6e  |.......This is n|
    00000c80  6f 74 20 61 20 62 6f 6f  74 61 62 6c 65 20 64 69  |ot a bootable di|
    00000c90  73 6b 2e 20 20 50 6c 65  61 73 65 20 69 6e 73 65  |sk.  Please inse|
    00000ca0  72 74 20 61 20 62 6f 6f  74 61 62 6c 65 20 66 6c  |rt a bootable fl|
    00000cb0  6f 70 70 79 20 61 6e 64  0d 0a 70 72 65 73 73 20  |oppy and..press |
    00000cc0  61 6e 79 20 6b 65 79 20  74 6f 20 74 72 79 20 61  |any key to try a|
    00000cd0  67 61 69 6e 20 2e 2e 2e  20 0d 0a 00 00 00 00 00  |gain ... .......|
    00000ce0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    00000df0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
    00000e00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    00004000  f8 ff ff 0f ff ff ff 0f  f8 ff ff 0f ff ff ff 0f  |................|
    00004010  ff ff ff 0f ff ff ff 0f  ff ff ff 0f ff ff ff 0f  |................|
    00004020  ff ff ff 0f 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    00004030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    00051000  f8 ff ff 0f ff ff ff 0f  f8 ff ff 0f ff ff ff 0f  |................|
    00051010  ff ff ff 0f ff ff ff 0f  ff ff ff 0f ff ff ff 0f  |................|
    00051020  ff ff ff 0f 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    00051030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    0009e000  41 74 00 65 00 73 00 74  00 31 00 0f 00 2e 00 00  |At.e.s.t.1......|
    0009e010  ff ff ff ff ff ff ff ff  ff ff 00 00 ff ff ff ff  |................|
    0009e020  54 45 53 54 31 20 20 20  20 20 20 10 00 00 ba 23  |TEST1      ....#|
    0009e030  4d 4c 4d 4c 00 00 ba 23  4d 4c 03 00 00 00 00 00  |MLML...#ML......|
    0009e040  41 74 00 65 00 73 00 74  00 32 00 0f 00 9a 00 00  |At.e.s.t.2......|
    0009e050  ff ff ff ff ff ff ff ff  ff ff 00 00 ff ff ff ff  |................|
    0009e060  54 45 53 54 32 20 20 20  20 20 20 10 00 00 a1 23  |TEST2      ....#|
    0009e070  4d 4c 4d 4c 00 00 a1 23  4d 4c 04 00 00 00 00 00  |MLML...#ML......|
    0009e080  41 74 00 65 00 73 00 74  00 33 00 0f 00 76 00 00  |At.e.s.t.3...v..|
    0009e090  ff ff ff ff ff ff ff ff  ff ff 00 00 ff ff ff ff  |................|
    0009e0a0  54 45 53 54 33 20 20 20  20 20 20 10 00 00 a1 23  |TEST3      ....#|
    0009e0b0  4d 4c 4d 4c 00 00 a1 23  4d 4c 05 00 00 00 00 00  |MLML...#ML......|
    0009e0c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    0009e200  2e 20 20 20 20 20 20 20  20 20 20 10 00 00 a1 23  |.          ....#|
    0009e210  4d 4c 4d 4c 00 00 a1 23  4d 4c 03 00 00 00 00 00  |MLML...#ML......|
    0009e220  2e 2e 20 20 20 20 20 20  20 20 20 10 00 00 a1 23  |..         ....#|
    0009e230  4d 4c 4d 4c 00 00 a1 23  4d 4c 00 00 00 00 00 00  |MLML...#ML......|
    0009e240  41 74 00 65 00 73 00 74  00 31 00 0f 00 a7 2d 00  |At.e.s.t.1....-.|
    0009e250  31 00 00 00 ff ff ff ff  ff ff 00 00 ff ff ff ff  |1...............|
    0009e260  54 45 53 54 31 2d 31 20  20 20 20 10 00 64 c3 23  |TEST1-1    ..d.#|
    0009e270  4d 4c 4d 4c 00 00 c3 23  4d 4c 06 00 00 00 00 00  |MLML...#ML......|
    0009e280  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    0009e400  2e 20 20 20 20 20 20 20  20 20 20 10 00 00 a1 23  |.          ....#|
    0009e410  4d 4c 4d 4c 00 00 a1 23  4d 4c 04 00 00 00 00 00  |MLML...#ML......|
    0009e420  2e 2e 20 20 20 20 20 20  20 20 20 10 00 00 a1 23  |..         ....#|
    0009e430  4d 4c 4d 4c 00 00 a1 23  4d 4c 00 00 00 00 00 00  |MLML...#ML......|
    0009e440  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    0009e600  2e 20 20 20 20 20 20 20  20 20 20 10 00 00 a1 23  |.          ....#|
    0009e610  4d 4c 4d 4c 00 00 a1 23  4d 4c 05 00 00 00 00 00  |MLML...#ML......|
    0009e620  2e 2e 20 20 20 20 20 20  20 20 20 10 00 00 a1 23  |..         ....#|
    0009e630  4d 4c 4d 4c 00 00 a1 23  4d 4c 00 00 00 00 00 00  |MLML...#ML......|
    0009e640  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    0009e800  2e 20 20 20 20 20 20 20  20 20 20 10 00 00 ba 23  |.          ....#|
    0009e810  4d 4c 4d 4c 00 00 ba 23  4d 4c 06 00 00 00 00 00  |MLML...#ML......|
    0009e820  2e 2e 20 20 20 20 20 20  20 20 20 10 00 00 ba 23  |..         ....#|
    0009e830  4d 4c 4d 4c 00 00 ba 23  4d 4c 03 00 00 00 00 00  |MLML...#ML......|
    0009e840  41 74 00 65 00 73 00 74  00 31 00 0f 00 0e 2d 00  |At.e.s.t.1....-.|
    0009e850  31 00 2d 00 31 00 00 00  ff ff 00 00 ff ff ff ff  |1.-.1...........|
    0009e860  54 45 53 54 31 2d 7e 31  20 20 20 10 00 64 45 24  |TEST1-~1   ..dE$|
    0009e870  4d 4c 4d 4c 00 00 45 24  4d 4c 07 00 00 00 00 00  |MLML..E$ML......|
    0009e880  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    0009ea00  2e 20 20 20 20 20 20 20  20 20 20 10 00 64 c3 23  |.          ..d.#|
    0009ea10  4d 4c 4d 4c 00 00 c3 23  4d 4c 07 00 00 00 00 00  |MLML...#ML......|
    0009ea20  2e 2e 20 20 20 20 20 20  20 20 20 10 00 64 c3 23  |..         ..d.#|
    0009ea30  4d 4c 4d 4c 00 00 c3 23  4d 4c 06 00 00 00 00 00  |MLML...#ML......|
    0009ea40  41 68 00 65 00 6c 00 6c  00 6f 00 0f 00 f1 2e 00  |Ah.e.l.l.o......|
    0009ea50  74 00 78 00 74 00 00 00  ff ff 00 00 ff ff ff ff  |t.x.t...........|
    0009ea60  48 45 4c 4c 4f 20 20 20  54 58 54 20 00 64 45 24  |HELLO   TXT .dE$|
    0009ea70  4d 4c 4d 4c 00 00 45 24  4d 4c 08 00 13 00 00 00  |MLML..E$ML......|
    0009ea80  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    0009ec00  79 6f 75 20 61 72 65 20  6d 79 20 66 72 69 65 6e  |you are my frien|
    0009ec10  64 21 0a 00 00 00 00 00  00 00 00 00 00 00 00 00  |d!..............|
    0009ec20  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    027100004

    4.示例解析

    对如上创建的文件系统进行解析如下。

    4.1 保留区

    4.1.1 BPB和启动扇区

    启动跳转:本身占2字节它将程序执行流程跳转到引导程序处。

    OEMNAME:这部分占8字节,其内容由创建该文件系统的OEM厂商具体安排。

    详细参数请参见:FAT文件系统规范v1.03学习笔记---1.保留区之启动扇区与BPB

    4.1.2 引导程序

     

    引导程序代码:FAT32的DBR引导程序占用420字节,对于没有安装操作系统的分区来说这段程序是没有用处的。

    结束标志:为“55 AA”

    4.1.3 FSInfo区

    FAT32文件系统在保留区中安排了一个文件系统信息扇区,用以记录数据区中空闲簇的数量及下一个空闲簇的簇号,该扇区一般在分区的1号扇区,也就是紧跟着BPB和启动扇区后的一个扇区

    详细请参见:FAT文件系统规范v1.03学习笔记---1.保留区之 Fat32 FSInfo扇区结构和备份启动扇区

    4.1.4 BPB与启动扇区备份


    4.1.5 保留区之剩余部分空间

    4.2 FAT区

    FAT区一般为两个,用于备份。对于FAT32每4个字节表示一簇,用来表示簇的状态。由BPB分区中FATsz32可知FAT区大小为0x0268个也就是616个扇区。

    • FAT表结构及作用

    (1)FAT32文件一般有两份FAT,他们由格式化程序在对分区进行格式化时创建,FAT1是主,FAT2是备份。

    (2)FAT1跟在保留分区之后,其具体地址由BPB参数中指定,FAT2跟在FAT1的后面。

    (3)FAT表由FAT表项构成,我们把FAT表项简称FAT项,每个FAT项占用4字节。

    (4)每个FAT项都有一个固定的编号,这个编号从0开始。

    (5)FAT表项的前两个FAT项为文件系统保留使用,0号FAT为介质类型,1号FAT为文件系统错误标志。

    (6)分区的数据区中每个簇都会映射到FAT表中的唯一一个FAT项,因为0号FAT和1号FAT被系统占用,用户的数据从2号FAT开始记录。

    (7)如果某个文件占用很多个簇,则第一个FAT项记录下一个FAT项的编号(既簇号),如果这个文件结束了,则用“0F FF FF FF”表示。

    (8)分区格式化后,用户文件以簇为单位存放在数据区中,一个文件至少占用一个簇。

    (9)FAT的主要作用是标明分区存储的介质以及簇的使用情况

    • 定位FAT绝对位置的方法

    (1)首先从MBR的分区表中得知分区的起始扇区,偏移到此扇区(我的是单分区,没有分区表?)。

    (2)从DBR的BPB中得知DBR的保留扇区数,FAT表的个数,FAT表的大小。

    (3)因此FAT1=分区起始扇区+保留扇区数,FAT2=分区起始扇区+保留扇区数+FAT1大小。

    4.3 文件与目录数据区

    由于0号簇和1号簇用于特殊用途,实际目录和文件是从2号簇开始存放

    由hello.txt目录项可知它的内容存储在0x00000008的簇(8号簇)里面,如下图:

    再去回看前面FAT区中8号簇的状态为0ffffffff,表示这是最后一个簇

    •  数据区的定位方式

    数据区的位置在FAT2的后面,具体定位方式如下;

    (1)通过MBR中的分区表信息得知分区的起始位置。

    (2)通过分区中BPB保留扇区数以及FAT表的大小,FAT表的个数。

    (3)通过上面的信息就可以找到数据区的起始位置,根目录=数据区的起始扇区+(簇大小*2)。

    • 数据区分类

    数据区的内容主要由三部分组成:根目录,子目录和文件内容。在数据区中是以“簇”为单位进行存储的,2号簇被分配给根目录使用。

    • 根目录的定位方式

    根目录=分区起始扇区+DBR保留扇区+(FAT表*2)+(簇大小*2)

    FAT32文件系统中,分区根目录下的文件和目录都放在根目录区中,子目录中的文件和目录都放在子目录区中,并且没每32个字节为一个目录项,

    每个目录项纪录着一个目录或文件(也可能是多个目录项记录一个文件或目录)

    • 目录项分类

    在FAT32文件系统中,目录项可以分为四类:卷标目录项、“.”和“..”目录项、短文件名目录项、长文件名目录项

    (1)卷标目录项:卷标就是分区的名字,可以在格式化分区时创建,也可以随意修改,长度为11字节。

    (2)“.”和“..”目录项:“.”表示当前目录,“..”表示上一层目录。这两个目录项多存在子目录中。

    (3)短文件名目录项:所谓短文件名既文件名的“8.3”格式,此格式支持主文件名不能超过8字节,扩展名不能超过3字节。短文件名目录始终存放在一个目录项中。

    (4)长文件名目录项:由于短文件名“8.3”的格式远远不能满足现实中的需求,所以就出现了长文件名,长文件名其实就是将文件名进行分段,分成若干个短文件名进行存储。

    • 长文件名处理原则

    (1)系统取长文件名的前6个字符加上“~1”形成短文件名,其扩展名不变;

    (2)如果已存在这个名字的文件,则符号“~”后的数字自动增加;

    (3)如果文件名内存在windows非法的字符,则以下划线“_”代替;

    (4)长文件名目录项采用倒叙的方式进行记录。

  • 相关阅读:
    Spring学习(二) AOP 面向切面编程之概念(一)
    Spring学习(一) IOC容器学习
    多线程和同步分别有几种实现方法?
    如何理解"=="和equals方法
    &和&&的区别
    关于静态方法和非静态方法之间的调用
    缘来了,来园了
    Java设计模式-代理模式
    JavaBitSet学习
    kafka安装
  • 原文地址:https://www.cnblogs.com/smartjourneys/p/8446449.html
Copyright © 2011-2022 走看看