FAT32 文件系统 实践

FAT32文件系统的存储组织结构
(一)
http://blog.chinaunix.net/uid-26913704-id-3213948.html
(二)
http://blog.chinaunix.net/uid-26913704-id-3213951.html


FAT32 存放的内容 从低地址 到 高地址 一般如下
* DBR (boot sector)
* FAT1
* FAT2
* root (目录信息)
* data(数据部分)


FAT boot sector

该U盘目前还没有任何的文件,是个空U盘

FAT32 文件系统 实践_第1张图片

WinHex打开U盘
FAT32 文件系统 实践_第2张图片

20H处的4个字节为扇区总数
0x00E5EF00 = 15,068,928(10)
15068928*512(字节) = 7,715,291,136(字节)
将近7G多,与windows下基本一致

其它相关信息
偏移0BH:扇区字节数 00 02 即0X0200,512字节
偏移0DH:每簇扇区数 08 ,即每簇包括8个扇区, 一个族的大小为 8*512字节=4*1024字节,即4KB(也就是文件存取的最小单位是 4KB(一个“块”的大小))
偏移0EH:保留扇区数 48 0D即0x0D48 ,保留3400个扇区
偏移10H:FAT表份数 02,即两个FAT表 FAT1,FAT2
偏移2CH:根目录入口簇号 02 00 00 00即根目录从02号簇开始
偏移24H:FAT表占用扇区数 5C 39 00 00, 即FAT表占14684个扇区



FAT32的 FAT表

FAT表(文件分配表),是FAT文件系统中用于磁盘数据索引和定位而引进的一种链式结构。在FAT文件系统中,文件的存储依照FAT表制定的簇链式数据结构来进行。同时,FAT文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。

在偏移0EH处存储了保留扇区的个数,这个保留扇区数指的就是当前分区内DBR到FAT表之间的所有扇区的个数(包括DBR但不包括FAT表)。因此,我们可以定位FAT表所在的起始偏移位置了,即0D48H*200H=1A9000H。

通过WinHex查看相应位置,发现1A9000H就是FAT1的地址
FAT32 文件系统 实践_第3张图片

FAT2偏移地址 = FAT1偏移地址+FAT1的大小
=1A9000H + 395CH*200H
= 8D4800H


FAT32 root director

根目录起始扇区=保留扇区数+FAT×2+(起始簇-2)x每簇的扇区数
= 0D48H+395CH*2H+(2-2)*8H
=8000H

偏移地址 = 8000H*200H(扇区字节数) = 1000000H

FAT32 文件系统 实践_第4张图片

目录区的一个目录项占用32个字节,可以是长文件名目录项、文件目录项、子目录项等。
参考:http://blog.chinaunix.net/uid-26913704-id-3213948.html

(1) 0– 7字节 文件正名。
(2) 8–10字节 文件扩展名。
(3) 11字节文件属性,按二进制位定义,最高两位保留未用,0至5位分别是只读位、隐藏位、系统位、卷标位、子目录位、归档位。
(4) 11–13字节仅长文件名目录项用,用来存储其对应的短文件名目录项的文件名字节校
验和等。
(5) 13–15字节 24位二进制的文件建立时间,其中的高5位为小时,次6位为分钟。
(6) 16–17字节 16位二进制的文件建立日期,其中的高7位为相对于1980年的年份值,次4位为月份,后5位为月内日期。
(7) 18–19字节 16位二进制的文件最新访问日期,定义同(6)。
(8) 20–21字节 起始簇号的高16位。
(9) 22–23字节 16位二进制的文件最新修改时间,其中的高5位为小时,次6位为分钟,后5位的二倍为秒数。
(10)24–25字节 16位二进制的文件最新修改日期,定义同(6)。
(11)26–27字节 起始簇号的低16位。
(12)28–31字节 32位的文件字节长度。

其中第(4)至(8)项为以后陆续定义的。对于子目录项,其(12)为零;已删除目录项的首字节值为E5H。在可以使用长文件名的FAT32系统中,文件目录项保存该文件的短文件名,长文件名用若干个长文件名目录项保存,长文件名目录项倒序排在文件短目录项前面,全部是采用双字节内码保存的,每一项最多保存十三个字符内码,首字节指明是长文件名的第几项,11字节一般为0FH,12字节指明类型,13字节为校验和,26–27字节为零。


可以看到U盘的名称前7个字节,对比ASCII码表 可以看到文件名称是符合的

16进制 4D 41 53 54 45 52 20 20
10进制 77 65 83 84 69 82 32 32
字符 M A S T E R

如下 新建一个 ABC 目录 可以看到如下的目录信息

这里写图片描述


文件查找

按照上诉目录的32字节的信息

文件内容偏移位置 = root偏移+(文件的起初簇号 - 根目录起始簇号)*一个簇大小

我们新建a.txt文件
文件里面的内容是 12345678, 8个字节大小
FAT32 文件系统 实践_第5张图片

可以看到 最后4个字节 08 00 00 00,说明文件大小是0x00000008(即8个字节大小)
看到偏移是04 00 即 文件起始簇号是4

文件内容偏移位置:
1000000H + (04 - 02)* 4KB
4KB= 2^12 = 1 0000 0000 0000 = 1000H

1000000+ 2*1000H = 1002000H
所以a.txt的内容在 1002000H的位置

这里写图片描述


数据恢复

重新做了实验,上面的地址都有了的变化

目前U盘下 文件有
ABC空目录
a.txt 内容是:12345678
b.txt内容是: 12345

FAT32 文件系统 实践_第6张图片

这里写图片描述

这里写图片描述


现在使用 shift+delete 删除a.txt文件

WinHex 没有关闭,刷新后再显示
FAT32 文件系统 实践_第7张图片

文件时候还存在 看到了不是A.txt一个文件,通过WinHex查看内容,可以看到12345678 的内容,说明就是a.txt
FAT32 文件系统 实践_第8张图片

复制内容到新文件a.txt就能得到a.txt了 内容是12345678
FAT32 文件系统 实践_第9张图片


你可能感兴趣的:(#,操作系统)