本文主要介绍fat文件系统(fat12文件系统)详解,下面一起看看fat文件系统(fat12文件系统)详解相关资讯。
文件系统是计算机系统不可缺少的一部分。可以说,除了一些简单的单片机系统,文件系统是支撑每一个计算机系统运行的最重要的支撑,操作系统、应用程序、文档、音视频都是基于文件系统的。所以这说明了文件系统在计算机上的重要地位。嵌入式系统需要使用大容量存储设备的场合很多。此时可以直接使用存储设备的读写api来保存和读取数据。然而,这与计算机系统的文件不兼容。如果要在嵌入式系统使用的内存中存储电脑系统上的一张图片或者txt文件,会很麻烦。但是,如果这种嵌入式存储器采用与fat文件系统兼容的存储格式,那么与个人电脑交换文件将会非常方便。比如一般场合用的tf卡,如果直接调用读写函数访问tf也不是不可以,但是如果tf卡有fat文件系统,可以用读卡器直接从电脑上拷贝文件,大大方便了文件的交互。
鉴于文件系统的重要性,有必要分析一下文件系统的组成原理。这里以目前主流的windows文件系统fat32为对象,分析文件系统的存储机制。
下面简单介绍一下fat32文件系统:fat32文件系统你并不陌生。最多在windows操作系统中有,但在一些嵌入式产品(如手机、mp3播放器、mp4播放器等)中也有。).从某种意义上来说,fat32文件系统是非常成功的,它使我们能够更方便、更高效地组织数据,而无需受到底层存储设备的驱动。配备大容量存储器(如sd卡、cf卡、硬盘等)将是非常有意义的。)在带有fat32文件系统的单片机系统中(比如创建的数据文件可以直接在windows等操作系统中读取等。).
我手里有一张512mb的tf卡。插入电脑,用二进制查看软件打开tf卡。以下是复制数据的第一个512字节,用于解释:
偏移量0 1 2 3 4 5 6 7 8 9 a b c d e f 00000000 eb 58 90 4d 53 44 4f 53 35 2e 30 00 02 08 74 18 x . msdos 5.0...f8 00 00 3f 00法国法郎00 00 00 00 00.....?..?.?.....00000020 00 34 0f00 c6 03 00 00 00 00 00 00 00 02 00 00 00 00..古英语中代表a和e之间元音的字母...........00000030 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000040 80 01 29 22 be a5 f6 4e 4f 20 4e 41 4d 45 20 20。) 编号00000050 20 20 46 41 54 33 32 20 20 20 20 33 c9 8e d1 bc f4 fat 32 3é| vˇ@ nˇv 00000070 40 b4 41 bb aa 55 cd 13 72 10 81 fb 55 aa 75 0a @ a uí。r..u u . 000000080 f6 c1 01 74 05 fe 46 02 eb 2d 8a 56 40 b4 08 cd奥贾德. t . fv @í000000090 13 73 05 b9 ff ff 8a f1 66 0f b6 c6 40 66 0f b6 . s . f. ℃@ f . 000000 a0 d1 80 e2 3f f7 e2 86 cd c0 ed 06 41 66 0f b7af . 000000 b066 f7 e1 66 89 46 f8 83 7e 16 00 75 39 83 7e 2a..u9 \u* 000000 c0 00 77 33 66 8b 46 1c 66 83 c00c bb 00 80 b9 01 .w3f?f.f?à.。000000 d0 00 e8 2c 00 e9 a8 03 a1 f8 7d 80 c4 7c 8b f0 ac .è.?}?|?e000000 e0 84 c0 74 17 3c ff 74 09 b4 0e bb 07 00 cd 10 eb ?àt.?t.。..000000 f0 ee a1 fa 7d eb e4 a1 7d 80 eb df 98 cd 16 cd 19000100 66 60 80 7e 02 00 0f 84 20 00 66 6a 00 66 50 06 f `~...fj . fp . 00000110 53 66 68 10 00 01 00 b4 42 8a 56 40 8b f4 cd 13 sfh....b?v@í.00000120 66 58 66 58 66 58 66 58 66 58 eb 33 66 3b 46 f8 72 03 fxfxfxfx 3f;0000130 f9 eb 2a 66 33 d2 66 0f b7 4e 18 66 f7 f1 fe c2 \u f \u n \u f \u 0000140 8a ca 66 8b d0 66 c1 ea 10 f7 76 1a 86 d6 8a 56 ?êf?efáê.÷v.?v00000150 40 8a e8 c0 e4 06 0a cc b8 01 02 cd 13 66 61 0f..ì ..一、?t?.?..f @ iu &; boo 00000170 54 4d 47 52 20 20 20 20 20 00 00 00 00 00 00 00 00 00 00 00 00........00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000 1a 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0a 44 69..............迪000001 b0 73 6b 20 65 72 72 6f 72 ff 0d 0a 50 72 65 73 73error?..按000001 c0 2 0 61 6e 79 20 6b 65 79 20 74 6f 20 72 65 73 74任意键休息000001 d0 61 72 74 0d 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00艺术.............000001 e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................000001 f0 00 00 00 00 00 00 00 00 00 00 ac 01 b9 01 00 00 55 aa...........u let 下面说说最重要的dbr(dos引导记录操作系统引导记录区)。dbr是我们进入fat32的第一道防线。事实上,dbr的bpb部分是这个区域的核心部分(第12 ~ 90个字节是bpb)。只有彻底理解bpb的含义,我们才能更好地认识和操作fat32。关于dbr在fat32中的位置就不多说了。上述数据中的前90个字节是bpb的主要部分。bpb的c语言结构如下:
struct fat 32 _ dbr { unsigned char bs _ jmp boot[3];//跳转指令offs: 0无符号charbs _ o: 3无符号char bpb _ bytes persc[2];//每扇区字节数offs: 11 unsigned char bpb _ secperclus[1];//每簇扇区数offs: 13 unsigned char bpb _ rsvdseccnt[2];//预留扇区数offs: 14 unsigned char bpb _ numfats[1];//本卷胖表数offs: 16 unsigned char bpb _ rootencnt[2];//fat32为0 offs: 17 unsigned char bpb _ totsec 16[2];//fat32为0 offs: 19 unsigned char bpb _ m: 21 unsigned char bpb _ fatsz 16[2];//fat32为0 offs:22无符号。d char bpb _塞克[2];//轨道扇区数offs: 24 unsigned char bpb _ numh: 26 unsigned char bpb _ hidd sec[4];//前面隐藏扇区数//胖区偏移量: 28 unsigned char bpb _ totsec 32[4];//本卷总扇区数offs: 32 unsigned char bpb _ fatsz 32[4];//胖表offs:36无符号charbpb _ : 40 unsigned char bpb _ fs v: 42 unsigned char bpb _ root clus[4];//根目录簇号offs: 44 unsigned charfsinfo[2];//保留扇区数fsinfo offs: 48 unsigned char bpb _ bkbootsec[2];//通常6 offs: 50 unsigned char bpb _ r: 52 unsigned charbs _ drv num for : 64 unsigned char bs _ r: 65 unsigned char bs _ bootsig[1];//offs: 66 unsigned char bs _ volid[4];//offs: 67 unsigned char bs _ filsystyp: 71 unsigned char bs _ filsystyp: 82 };对于每个字段大小和含义都有详细的注释,解析这些数据是我们探索文件系统的首要任务。需要注意的是,在bpb,数据是以小端模式存储的,所以需要转换51单片机的大端模式,而一般arm的默认模式是小端模式,所以不需要进行转换操作。
在简单介绍了dbr的bpb之后,我们需要介绍一下fat表(文件分配表)的概念。什么是文件分配表?顾名思义,它是一个为文件分配存储空间的表,其中包含的不是文件的数据,而是文件所在簇的信息,下面会详细说明。
fat表是一种链式结构,用于在fat32文件系统中索引和定位磁盘数据(文件)。可以说fat表是fat32文件系统中最有特色的部分,其链式存储机制也是fat32的精髓。也正是因为有了它,数据存储才能不连续,磁盘的功能才能更好的发挥。
那么胖表在哪里?到底是什么样的?这时,我们将回到刚才的bpb部分。在bpb有一个字段叫bpb_rsvdseccnt,意思是预留山的数量,实际上是预留给bpb的空间的扇区数。也就是说这个值代表了fat表前面空间的大小,所以fat表的地址就是这个字段的值。实际上,为了保证文件系统中的正确性和稳定性,设置了两个相同的fat表,并且两个fat是同步的,也就是说,一个fat表的操作也要在另一个fat表中进行,以保证它们的内容时刻保持一致。这是为了安全起见。当一个fat因为某些原因损坏时,可以从另一个fat表中恢复。
fat表的内容如下图所示:
上图是一张实际的胖桌子。前8个字节 f8 ff ff 0f ff ff ff ff ff是fat32的fat头标,表示这是fat表的开始。下面的数据是每四个字节一个簇项(从第二个簇开始),用来标记这个簇的下一个簇号。
上面已经说了很多,都是围绕集群这个词。什么是集群?为什么要引入fat32?磁盘上最小的可寻址存储单元称为扇区,每个扇区通常为512字节。因为大部分文件都比扇区大很多,如果把最小的存储空间分配给一个文件,内存就可以存储更多的数据,这个最小的存储空间就叫做一个簇。根据存储设备(磁盘、闪存卡和硬盘)的容量,簇的大小可以不同,以最有效地利用存储空间。在早期的360kb磁盘上,集群大小为2个扇区(1024字节);第一批10mb硬盘的簇大小增加到8个扇区(4096字节);今天的典型集群规模 的小型闪存设备是8kb或16kb。2gb以上的硬盘驱动器有32kb的簇。如果为大容量的存储定义一个小簇,那么fat表的体积会非常大,导致数据冗余,效率下降。
需要指出的是,簇是fat32数据存储的最小单位,内部扇区不能再细分。即使文件的数据被写入簇中,簇中仍有剩余容量(内部扇区未满)。即使这个簇只写一个字节,其他文件的数据也无法跟在数据后面,只能找到未被占用的簇。
那么胖桌子有多大呢?fat表中每四个字节代表一个簇,所以fat表的大小由簇的实际数量决定。从这里也可以看出,集群太大的话,胖表会小,但是会浪费空间,而集群太小的话,会减少空间的浪费,但是会让胖表臃肿。fat表的大小可以从bpb参数bpb_fatsz32中读取。
现在我们知道了fat表的地址和大小,我们也知道有了两个fat表,我们就可以计算出第一个文件夹的位置,也就是根文件夹,它就在fat表的后面。计算方法如下:
first dir sector = firstfatsector bpb _ num fats[0]* fat sectors,其中first fat sector表示fat表的位置,bpb _ numfats [0]表示fat表的数量,fat sectors表示fat表占用的扇区数量。其实根目录所在的集群就是集群2。计算根文件夹的位置后,可以从根文件夹中读取数据。其实fat32中已经扩展了文件的概念,目录也是文件,而且根目录的位置和其他目录一样,所以根目录也算是文件。既然是文件,就会有文件名,根目录的名字就是磁盘的卷标。
所以下面说根目录文件的内容。首先,目录也是一个文件,可以看作是一个特殊的文件。该文件用于存储其他文件或目录的信息,如文件名、扩展名、属性、创建时间、上次修改时间、文件初始簇号、文件长度等。所以当我想读取一个文件信息时,我首先要做的就是从目录中读取文件信息数据。根据以上,我们获得了根目录的地址,所以可以从根目录中读取根目录下的文件信息。每个文件/目录由目录文件中的32字节数据表示。具体字段如下。显示:
这样,我们可以从根目录读取文件。作为一个实验,我们不。;t设计嵌套目录的结构,只做根目录下的文件查看、读写实验。所以我的512m tf卡的根目录下有一个test.txt文件,根目录下的数据如下:
偏移量0 1 2 3 4 5 6 7 8 9 a b c d e f 00400000 42 20 00 49 00 6e 00 66 00 6f 00 00 00 72 72 00 b . i . n . f . o...rr.00400010 6d...n...00400020 01 53 00 79 00 73 00 74 00 65 00 0f 00 72 6d 00...rm . 00400030 20 00 56 00 6f 00 6c 00 75 00 00 00 00 6d 00 65 00...4d 7e 31 20 20 20 20 16 00 23 bb 58系统~1..# x 00400050 7e 49 7e 49 00 00 bc 58 7e 49 03 00 00 00 00 00 ~ i ~ i..x~i......00400060 54 45 53 54 20 20 20 20 54 58 54 20 18 23 c0 58考试txt。#àx 00400070 7e 49 81 49 00 00 5a 57 7e 49 05 00 13 20 00 00 ~ i . i..zw~i.....00400080 54 41 4e 47 51 55 41 4e 20 20 20 08 00 00 00 00汤泉.....00400 09000000000000000 da 587e 49 000000000000 x ~ i 004000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000前面这两个文件信息表面上可能代表一些隐藏的文件,但我不 我不知道它们是什么。无论如何,可以从fat32文件系统中成功获取根目录中文件的信息。下一步就是找到文件存放位置,根据这个文件的信息读取文件内容。
32字节的文件信息已经明确给出。确定文件的实际簇号后,可以进入fat表查找文件的簇和簇链。根据文件长度字段,可以知道文件占用了多少簇。事实上,你可以根据簇的链式存储结果知道文件所占的簇数,但是你不知道。;t不知道文件在最后一个簇中占了多少字节,所以文件长度字段还是很有意义的。找到相应的簇后,只需从相应的簇中读取数据,简单易行。;不是吗?
了解更多fat文件系统(fat12文件系统)详解相关内容请关注本站点。
将word中的图片取出来(word文档怎么把图片取出来)
传舟笔记本垃圾,神舟笔记本是不是很烂不耐用买洋垃圾更好
美的布谷风扇的扇叶有多少片组成(美的布谷风扇说明书)
vivoxplay6和vivox21哪个好(vivox7和vivoxplay6哪个好)
win10企业版怎么装(window10企业版安装教程)
fat文件系统详解(fat12文件系统)
监控录像机硬盘怎么设置
小米手机怎么刷机图片,小米如何刷机
u盘出现数据写入失败的原因及其解决方法视频(u盘出现数据写入失败的原因及其解决方法是什么)
苹果手机怎么更新日历
ios12.4发热严重(ios12.5.3发热)
健身设备生产厂家(健身器材生产厂家排名)
两个硬盘系统怎么装系统(两个硬盘如何做双系统)
文件管理怎么安装文件
qq群接龙是什么功能(qq群接龙是什么样子)
lg g3 art怎么开,LGG3手机手写板如何打开
网络科技公司税点是多少 有免税
mx5双屏幕怎么返回,魅族mx5返回键是哪个
威刚固态硬盘,威刚的固态硬盘好还是联想的固态硬盘好
三星gti9158v怎么调模式,三星gti9158v护眼模式如何关闭