文件系统

文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法.在移动存储设备上比较常用的有FAT文件系统和ExFAT文件系统。

FAT分区依据FAT表中每个簇链的所占位数分为fat12、fat16、fat32三种格式;

exFAT是为了解决FAT32等不支持4G及其更大的文件而推出的文件系统。

知识点

bios

bios(basic input output system),他是一组固化在计算机主板上ROM芯片上的程序,保存着计算机最重要的基本输入输出程序,开关机自荐程序和系统自启动程序.他可以从CMOS上读写系统设置的具体信息,主要为计算机提供最底层,最直接的硬件设置和控制.

MBR扇区

MBR(master boot record)即主引导扇区(或记录),位于整个硬盘的0柱面0磁头1扇区(即硬盘的第一个扇区),bios在执行完自己固有的程序后会jump到MBR的第一条指令,并将系统的控制权交由MBR,总共1个扇区的主引导记录,MBR引导程序战前446字节(0h~1bdh),随后的64字节(1beh~1fdh)为DPT(disk partitiontable),最后为"55 aa"结束符.
MBR具有公共引导的特性,与具体的操作系统无关,具有唯一性.

名词解释

FAT :   File Allocation Table.文件分配表
EXFAT: Extended File Allocation Table .扩展文件分配表
BPB: BIOS Parameter block.BIOS参数块
BS: Boot Sector.启动扇区
LSN: Logical Sector Number.逻辑扇区号
PSN: Physical Sector Number.物理扇区号
LBA: Logical Block Address.逻辑块地址

FAT12

采用12位文件分配表
最大簇总数4085(2的12次方)
最大分区容量8M (4096clusters × 4sectors/clusters × 512bytes/sectors)
只能是8.3格式的文件名(短名)

FAT16

采用16位的文件分配表
最大簇总数65524(2的16次方)
最大分区容量2G
严重缺陷:大容量磁盘利用效率低

FAT32

采用32位的文件分配表
最大簇总数(2的32次方)
单个文件不能大于4G
当分区小于512M时,Fat32不会发生作用
不超过8GB的分区中,FAT32分区格式的每个簇都固定为4KB
Fat32不能保持向下兼容

注:可以通过WinHex查看磁盘分区信息

FAT表数据结构

FAT表是一一对应于数据区簇号的列表,文件系统分配磁盘空间是按簇来分配,因此,文件占用磁盘空间时,基本单位是簇。
FAT表是根据簇数来和文件对应的。第一个存放数据的簇是簇2。
FAT表项的大小与FAT类型有关,FAT12的表项为12-bit,FAT16为16-bit,FAT32则为32-bit.
FAT32的FAT表项只有28-bit可以使用,所以他的高4位保留。FAT32在扇区号为6的地方完整地拷贝了一份启动扇区的备份,包括BPB的内容。

FATType的判定条件

FAT类型(FATType)的检测(是FAT12,或是FAT16,还是FAT32)只能通过计算FAT卷中数据区所占的簇数(CountofClusters)来判定,没有其他办法。

FAT目录结构

对于FAT12/FAT16,根目录存储在磁盘中固定的地方,它紧跟在最后一个FAT表后。根目录的扇区数也是固定的,可以根据**BPB_RootEntCn**t计算得出。

FAT32的根目录由簇链组成,其扇区数不确定,根目录的第一个扇区号存储在BPB_RootClus中,根目录不同于其他的目录,没有日期和时间戳,也没有目录名,同时根目录里没有“.”和“..”这两个目录项。根目录另一个特殊的地方在于,根目录中有一个设置 ATTR_VOLUME_ID 位的文件,这个文件在整个FAT卷中是唯一的。

DIR_NTRes
当文件只有短名时,该短名的大小写规则如下:

1. 此值为18H时,文件名和扩展名都小写。
2. 此值为10H时,文件名大写而扩展名小写。
3. 此值为08H时,文件名小写而扩展名大写。
4. 此值为00H时,文件名和扩展名都大写。

DIR_Attr

长名与短名规则

短文件名(8+3name)是FAT16遗留下来的,为了兼容windows以后的版本文件和目录都有长名和短名。
长名目录项和对应的别名(短名)目录项的存储有以下6个处理原则:

1.取长文件名的前6个字符加上“~1”形成长文件名的别名(即短文件名),并将长文件名中最后一部分(最后一个间隔符“.”后面字符)的前3个字符作为其扩展名。
2.如果已存在这个名字的文件,则符号“~”后的数字会自动增加
3.任何包括小写字母的文件名都被看作是长文件名,而不管其长度是多少。
4.长文件名存储在属性标志为OFH的32字节目录登记项中(这是与短文件名目录项的区别)。用Unicode格式编码,每个字符(无论是英文或是汉字)均占2字节。
6.每个目录登记项用26个字节存储13个字符(序号由第1字节指定)。位置多余时,先用00h表示结束,再用FFH填充。
7.长文件名用若干个长名目录项保存,长文件名目录项倒序排在文件短目录项前面。

Windows9x会根据应用程序的性质分别给予不同的文件名,16位应用程序得到8.3格式的文件名,而32位应用程序得到长文件名。

注:尽量不要在根目录下创建长文件名!

FAT计算公式

根目录所占的扇区数(RootDirSectors):

RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytePerSec - 1)) / BPB_BytePerSec;

数据区的起始地址(FirstDataSector) :

FirstDataSector = BPB_RsvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors;

其中,FATSz可以由下面条件获取:
If(BPB_FATSz16 != 0)
FATSz = BPB_FATSz16;
Else
FATSz = BPB_FATSz32;

由于每一个存放数据的簇是簇2,所以数据区的起始地址也相当于簇2 的起始地址,由此可以得到下面的一个计算公式。
给一个合法的簇号N(N>=2),可以由该簇号计算得出该簇的每一个扇区号:

FirstSectorofCluster =((N - 2)* BPB_SecPerClus + FirstDataSector)

数据区中的扇区数(DataSec):

DataSec=TotSec - FirstDataSector;

其中,TotSec可以由下面条件获取:
If(BPB_TotSec16 != 0)
TotSec = BPB_TotSec16;
Else
TotSec = BPB_TotSec32;

数据区中的总簇数(CountofClusters):

CountofClusters = DataSec / BPB_SecPeClus;

某个簇号在FAT表中的位置:
A)簇N在第一个FAT表中的扇区数(ThisFATSecNum):

ThisFATSecNum = BPB_RsvdSecCnt + (FATOffset / BPB_BytePerSec);

其中FATOffset可以由下面条件获取:
If(FATType == FAT16)
{
FATOffset = N*2;
}
Else If(FATType == FAT32)
{
FATOffset = N*4;
}

B)簇N在第一个FAT表中所在扇区的偏移(ThisFATEntOffset):

ThisFATEntOffset = FATOffset % BPB_BytePerSec;

*注:以上的计算结果都是四舍五入的。

EXFAT

单个文件大小突破4GB的限制,最大可达到32GB、
分区大小突破之前32GB的限制,最大可达到2TB。
内部结构调整,实现同样功能的操作,相比较之前的FAT系统,减少读写设备的次数。
对DBR表,文件名,文件目录项等,增加校验字段,提高数据安全性。
簇大小可高达32MB。
采用了剩余空间分配表,剩余空间分配性能改进。
同一目录下最大文件数可达65535个。

exfat文件系统内部结构分配如下:

Exfat的Boot区最少为24个扇区,分成BOOT区和备份BOOT区,两个区各12个扇区。
跳转指令 EB 76 90 也是EXFAT的type识别码

EXFAT目录

根目录比较特殊,下面有三个特殊的目录项。具体如下:

其中第一个目录项不知道有何具体用意。
第二个目录项0x81,表示簇堆分配表文件。
第三个目录项0x82,表示大写表文件。
EXFAT普通目录下没有“.”和“..”目录项。
特殊目录项只存在根目录下,有卷标目录项、位映射目录项和大写表目录项,分别记录分区卷标,簇堆分配表文件和大写表文件。

EXFAT簇堆分配表

簇堆分配表,记录分区上所有簇的使用情况。每一个bit代表一个簇,0表示空簇,1表示该簇已被占用。起始簇号从2开始,也就是BIT0对应簇号2,BIT1对应簇号3。簇堆分配表以文件存储的方式存在,一般对应根目录下第一个文件,也就是第二个目录项。他的大小由总簇数决定,占用N个簇的空间。

EXFAT大写转换表

大写表是一张Unicode字符映射图,每一个字符占用2个字节。文件名比较时,先把文件名格式转换成Unicode,再通过该表把文件名转成大写Unicode,转换完成后才进行文件名比较。大写表中的数据进行了部分压缩,压缩起始标志码FFFFh,随后跟一个压缩长度。

注:硬盘的物理结构

FAT和EXFAT文件系统的更多相关文章

  1. hi35183e增加exfat文件系统的支持

    64G-128G的tf卡文件系统格式为exfat,而hi3518e默认只支持fat32格式的tf卡.为了挂载64G以上的tf卡,只能将sd卡先格式化成FAT32.鉴于exfat性能比FAT32强,因此 ...

  2. 三星在GPL下发布其exFAT文件系统实现源码

    exFAT文件系统是微软的一个产品,设计让外置储存设备和PC之间实现无缝的TB级数据转移和数据交换,它只支持Windows和OS X,不支持Linux.作为一个含有大量专利的私有产品,没有人会预计它会 ...

  3. Android5.1设备无法识别exFAT文件系统的64G TF卡问题

    64G TF卡刚买回来的时候默认exFAT文件系统,在电脑端(XP和WIN7)可以识别,但在我们Android5.1S设备无法识别,采用guiformat工具格式化为FAT32文件系统后才可以正常识别 ...

  4. NTFS,FAT32和exFAT文件系统的区别

    NTFS,FAT32和exFAT文件系统的区别 本文所有资料来源于网络,仅做个人学习使用,如有侵权,请联系删除 1.什么是文件系统 文件系统是系统对文件的存放排列方式,不同格式的文件系统关系到数据是如 ...

  5. Ubuntu---不能打开 exfat 文件系统格式的 U盘解决方法

    出现问题:今天把 U 盘插入 Ubuntu 系统的电脑中,打开 U 盘发现弹出 系统格式不支持 的提醒,无法进入 U 盘进行操作. 环境: Ubuntu18.04 TSL; 格式化为 exfat 文件 ...

  6. 联盛德 HLK-W806 (十三): 运行FatFs读写FAT和exFat格式的SD卡/TF卡

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  7. FAT和FAT32文件系统的原理

    [转自] http://www.sjhf.net/Article/sjhfdoc/200404/1.html 一.硬盘的物理结构:     硬盘存储数据是根据电.磁转换原理实现的.硬盘由一个或几个表面 ...

  8. ubuntu安装fat32和exfat文件系统支持

    vftp(fat32) apt install -y dosfstools exfat apt install -y exfat-fuse exfat-utils

  9. 磁盘文件系统Fat、Fat32、NTFS、exFAT的优缺点

    我们在Windows系统里格式化磁盘的时候,文件系统的选项里可以看到有“FAT”.“FAT32”.“NTFS”等选项,在对U盘或其他移动存储设备 格式化的时候还会出现“exFAT”选项,那么这四种磁盘 ...

随机推荐

  1. 手机CPU知识扫盲:谈谈手机CPU架构与原理

    CPU是手机上面最复杂,最贵的Soc(芯片),担任的也是手机中大脑的位置,是手机跑分性能的决定性硬件.智能手机发展到今天,各大手机CPU厂商也从春秋战国逐渐到了现在四国鼎立的时代(高通,MTK,三星, ...

  2. Spring MVC配置静态资源和资源包教程

    1- 介绍 这篇教程文章是基于: Spring 4 MVC 2- 创建一个项目 File/New/Other.. 输入: Group ID: com.yiibai Artifact ID: Sprin ...

  3. 图像sift配准后融合

    image rectification 图像校正 在配准时,先找到特征点,找到特征点后剔除伪匹配点. 然后针对两幅图像做几何矫正(一般通过估计出来的仿射矩阵完成). 这部完成后,图像可以匹配了,但是两 ...

  4. Java基础教程笔记

    第一部分——java基础程序设计 一:java语言特色 1:语言有点:“一次编写,到处运行” 2:相对于C++A:提供了对内存的自动管理:B:去除了C++语言中的“指针”:C:避免了赋值语句(如a=3 ...

  5. 第10章 Docker Machine 相关问题

    10.1 打开命令行后,看到下载啥 boot2docker.iso,然后总是超时失败,怎么办? 装了 Docker Toolbox 的 Windows 用户,或者第一次使用 docker-machin ...

  6. 如何获取继承中泛型T的类型

    @SuppressWarnings("unchecked") public void testT() { clazz = (Class<T>)( (Parameteri ...

  7. 读取文件之<绝对路径>与<相对路径>

    前言:字符流.字节流读取文件,下面的代码是在网上找到的一个各种文件读取方式,还算比较详细,分享给大家. public class ReadFromFile { /** * 以字节为单位读取文件,常用于 ...

  8. Unity3d 子线程能做的事

    一,子线程中能做的事: 1,数据逻辑方面计算: 二,子线程中,不能: 1,加载场景相关事件: Application.LoadLevelAsync.Application.LoadLevel等: 2, ...

  9. linux 终端操作快捷键

    熟练使用快捷键可以很大的提高效率,以下列出一些常用的快捷键命令方便随时查阅 1. 移动光标 Ctrl + a 标移到行首.它在多数文本编辑器和 Mozilla 的 URL 字段内可以使用.Ctrl + ...

  10. 20160924-1——mysql存储引擎

    一.主要存储引擎 5.5以后的版本,默认存储引擎从myisam改成了innodb:线上推荐都用innodb 二.innodb存储引擎 (一)结构 INNODB存储引擎大致分三部分,图中已经(1)(2) ...