说明:

MBR :Master Boot Record ( 主引导记录)

DBR :DOS Boot Record ( 引导扇区)

FAT :File Allocation Table ( 文件分配表)

硬件:本文SD卡为Kingston 4GB,FAT32格式,簇大小4KB,每扇区512字节。

第一章 硬盘结构与SD卡结构

1.1 硬盘介绍

1.1硬盘结构

假设你熟悉硬盘结构跳过本节。下图是硬盘的结构,假设你仅仅是为了学习SD卡FAT32文件系统的话,这里你仅仅须要注意硬盘排序结构:主引导记录(MBR)—引导扇区—数据—引导扇区—数据。

图1

1.2 MBR分析

MBR(Main Boot Record 主引导记录区)放置在硬盘物理地址0的地方。总共512字节的主引导扇区中,MBR仅仅占用了当中的446个字节,另外64个字节交给了 DPT(Disk Partition Table硬盘分区表),最后两个字节“55,AA”是分区的结束标志。DPT由4个分区表组成,每一个16字节。下图中以以硬盘的MBR图,粉红色为硬盘分区表。

图2

对于我们来说,更关注硬盘分区表表中红色区域:下图为硬盘分区表具体说明 。假设要对SD卡、U盘等分多个区,DPT的内容就表示各个区的偏移地址和大小。

起始地址

字节数

描写叙述

0x1BE

1

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

0x1BF~0x1C1

3

分区起始CHS地址(CHS=磁头、柱面、扇区),起始地址

0x1C2

1

分区类型

0x1C3~0x1C5

3

分区结束CHS地址

0x1C6

从磁盘開始到该分区開始的偏移量(分区起始LBA地址Little-endian顺序)

0x1CA

总扇区数(Little-endian顺序)

图3

SD结构

SD卡没有分区,默认就是一个分区。首先用WinHex文件打开SD所在的盘符,显演示样例如以下图:

图4

① 非分区空间(红线所看到的): 起始扇区0,我觉得这个分区就是硬盘上的MBR所在区域,

打开后例如以下图所看到的,也能够称为SD卡的MBR区域。

图5

依据表1知道:

)为下个分区的扇区地址,即第8192扇区,见图3分区1的起始扇区。

蓝线区域(00760C00)为SD卡总的扇区个数,我们能够计算一下:

0x760C00 *512(每扇区字节)= 3960995840 (字节),与实际大小基本一样。

② 分区1(蓝线所看到的):起始扇区8192.

③ 剩余扇区    : 才疏学浅,我不知道干嘛的,呵呵

1.3 SD卡存储结构

由此可知SD卡文件系统并非处在整个SD卡最開始的地方,它处在MBR所处的保留区之后,于是我们能够对使用FAT32文件系统的SD卡总体布局给出例如以下图示。

图6

第二章 FAT32文件系统介绍

2.1 FAT文件系统简单介绍

FAT(File Allocation Table,文件分配表)文件系统是windows操作系统所使用的一种文件系统,它的发展过程经历了FAT12、FAT16、FAT32三个阶段。FAT文件系统用“簇”作为数据单元。一个“簇”由一组连续的扇区组成,簇所含的扇区数必须是2的整数次幂。簇的最大值为64个扇区,即32KB。全部簇从2開始进行编号,每一个簇都有一个自己的地址编号。用户文件和文件夹都存储在簇中。 本文每簇4KB大小。

FAT文件系统的数据结构中有两个重要的结构:文件分配表和文件夹项:

文件分配表:文件和目录内容储存在簇中,假设一个文件或目录须要多余一个簇的空间,则用FAT表来描写叙述,怎样找到另外的簇。FAT结构用于指出文件的下一个簇,同一时候也说明了簇的分配状态。FAT12、FAT16、FAT32这三种文件系统之间的主要差别在与FAT项的大小不同。

文件夹项:FAT文件系统的每个文件和文件夹都被分配到一个文件夹项,文件夹项中记录着文件名称、大小、文件内容起始地址以及其它一些元数据。

在FAT文件系统中,文件系统的数据记录在“引导扇区中(DBR)”中。引导扇区位于整个文件系统的0号扇区,是文件系统隐藏区域(也称为保留区)的一部分,我们称其为DBR(DOS Boot Recorder——DOS引导记录)扇区,DBR中记录着文件系统的起始位置、大小、FAT表个数及大小等相关信息。在FAT文件系统中,同一时候使用“扇区地址”和“簇地址”两种地址管理方式。这是由于仅仅有存储用户

数据的数据区使用簇进行管理(FAT12和FAT16的根文件夹除外),全部簇都位于数据区。其它文件系统管理数据区域是不以簇进行管理的,这部分区域使用扇区地址进行管理。文件系统的起始扇区为0号扇区。

2.2 FAT32文件系统结构

FAT文件系统总体分布如上图 存储器文件结构图 所看到的,有:

【1深绿色】保留区含有一个重要的数据结构——系统引导扇区(DBR)。FAT12、FAT16的保留区通常仅仅有一个扇区,而FAT32的保留扇区要多一些,除0号扇区外,还有其它一些扇区,当中包含了DBR的备份扇区。

【2黄色】  FAT区由来年各个大小相等的FAT表组成——FAT1、FAT2,FAT2紧跟在FAT1之后。

【3灰色】  FAT12、FAT16的根文件夹尽管也属于数据区,可是他们并不由簇进行管理。也就是说FAT12、FAT16的根文件夹是没有簇号的,他们的2号簇从根文件夹之后開始。而FAT32的根文件夹通常位于2号簇。

2.2.1 保留区(深绿色区域)

FAT32文件系统的開始部分有一个由若干个扇区组成的保留区,保留区的大小会记录在DBR扇区中,比較常见的为32、34或38个扇区。如上图:由DBR中)0x0e和0x0f两个地址的数值决定,记得是小端模式,即N的值。

2.2.1.1 引导扇区(DBR)

【大小】:512字节;

对读写FAT文件系统来说经常使用的就图中红色划线部分,48个字节。其它的均为一些标注信息。想了解详细的定义请看附录表。

图7

】0x00~0x02:3字节,跳转指令。

】0x03~0x0A:8字节,文件系统标志和版本,这里为MSDOC5.0。

】0x0B~0x0C:2字节,每扇区字节数,512(0X02 00)。

】0x0D~0x0D:1字节,每簇扇区数,8(0x08)。

】0x0E~0x0F:2字节,保留扇区数,扇区。

】0x10~0x10:1字节,FAT表个数,2。

】,FAT12/FAT16为根文件夹中文件夹的个数;

】,FAT12/FAT16为扇区总数。

】0x15~0x15:1字节,哪种存储介质,0xF8标准值,可移动存储介质,经常使用的 0xF0。

】,FAT12/FAT16为一个FAT 表所占的扇区数。

】0x18~0x19:2字节,每磁道扇区数,仅仅对于有“特殊形状”(由磁头和柱面每
切割为若干磁道)的存储介质有效,63(0x00 3F)。

】0x1A~0x1B:2字节,磁头数,仅仅对特殊的介质才有效,255(0x00 FF)。

】0x1C~0x1F:4字节,EBR分区之前所隐藏的扇区数,个字节数值相等。

】0x20~0x23:4字节,文件系统总扇区数,7736320(0x 00 76 0C 00),7736320 * 
512 = 3960995840  ≈ 3.67GB。

】0x24~0x27:4字节,每一个FAT表占用扇区数,7541(0x 00 00 1D 75)。

】0x28~0x29:2字节,标记,此域FAT32 特有。

】0x2A~0x2B:2字节,FAT32版本0.0,FAT32特有。

】0x2C~0x2F:4字节,根文件夹所在第一个簇的簇号,2。(尽管在FAT32文件系统
下,根文件夹能够存放在数据区的不论什么位置,可是通常情况下还是起始于2号簇)

【19】0x30~0x31:2字节,FSINFO(文件系统信息扇区)扇区号1,该扇区为操作
系统提供关于空簇总数及下一可用簇的信息。

【20】0x32~0x33:2字节,备份引导扇区的位置。备份引导扇区总是位于文件系统
的6号扇区。

【21】0x34~0x3F:12字节,用于以后FAT 扩展使用。

【22】0x40~0x40:1字节,与FAT12/16 的定义同样,仅仅只是两者位于启动扇区不

同的位置而已。

【23】0x41~0x41:1字节,与FAT12/16 的定义同样,仅仅只是两者位于启动扇区不

同的位置而已 。

【24】0x42~0x42:1字节,扩展引导标志,0x29。与FAT12/16 的定义同样,仅仅只是
两者位于启动扇区不同的位置而已

【25】0x43~0x46:4字节,卷序列号。通常为一个随机值。

【26】0x47~0x51:11字节,卷标(ASCII码),假设建立文件系统的时候指定了卷
标,会保存在此。

【27】0x52~0x59:8字节,文件系统格式的ASCII码,FAT32。

★【28】0x5A~0x1FD:90~509共410字节,未使用。该部分没有明白的用途。

【29】0x1FE~0x1FF:签名标志“55 AA”。

★说明:引导代码

FAT文件系统将引导代码与文件形同数据结构融合在一起,FAT32文件系统引导扇区的512字节中,90~509字节为引导代码,而FAT12/16则是62~509字节为引导代码。同一时候,FAT32还能够利用引导扇区后的扇区空间存放附加的引导代码。一个FAT卷即使不是可引导文件文件系统,也会存在引导代码。

2.2.1.2 FSInfo信息分区

FAT32在保留区中添加了一个FSINFO扇区,用以记录文件系统中空暇簇的数量以及下一可用簇的簇号等信息,以供操作系统作为參考。FSINFO信息扇区一般位于文件系统的1号扇区,结构很easy。FSINFO信息扇区结构。

图8

【1】0x00~0x03: 4个字节,扩展引导标志“0x52526141”。

【2】0x04~0x1E3:480个字节,未使用,所有置0。

【3】0x1E4~0x1E7: 4个字节,FSINFO签名“0x72724161”。

【4】0x1E8~0x1EB: 4个字节,文件系统的空簇数,964466(0x00 0E B7 72)。

【5】0x1EC~0x1EF: 4个字节,下一可用簇号(0x 00 00 00 15)。

【6】0x1F0~0x1FD: 14个字节,未使用。

【7】0x1FE~0x1FF: 2个字节,“55 AA”标志。

温馨提示:通常情况下,文件系统的2号扇区结尾也会被设置“55 AA”标志。6号扇区也会有一个引导扇区的备份,对应的,7号扇区应该是一个备份FSINFO信息扇区,8号扇区能够看做是2号扇区的备份。

2.2.2 文件分区FAT表(黄色区域)

紧跟在保留分区后面的是FAT区,其由两个全然同样的FAT(File Allocation Table, 文件分配表)表单组成,FAT文件系统的名字也是因此而来。FAT 表(File Alloacation Table)是一组与数据簇号相应的列表。FAT2紧跟在FAT1之后,它的位置能够通过FAT1的位置加上FAT表的大小扇区数计算出来。

2.2.2.1 文件系统概述

文件系统分配磁盘空间按簇来分配。因此,文件占有磁盘空间时,基本单位不是字节而是簇,即使某个文件仅仅有一个字节,操作系统也会给它分配一个最小单元:即一个簇。对于大文件,须要分配多个簇。同一个文件的数据并不一定完整地存放在磁盘中一个连续地区域内,而往往会分若干段,像链子一样存放。这样的存储方式称为文件的链式存储。为了实现文件的链式存储,文件系统必须准确地记录哪些簇已经被文件占用,还必须为每一个已经占用的簇指明存储后继的下一个簇的簇号,对于文件的最后一簇,则要指明本簇无后继簇。这些都是由FAT表来保存的,FAT 表相应表项中记录着它所代表的簇的有关信息:诸如是空,是不是坏簇,是否是已经是某个文件的尾簇等。

v 对于文件系统来说,FAT表有两个重要作用:描写叙述簇的分配状态以及标明文件或文件夹的下一簇的簇号。

v 通常情况下,一个FAT把文件系统会有两个FAT表,但有时也同意仅仅有一个FAT表,FAT表的详细个数记录在引导扇区的偏移0x10字节处。

v 因为FAT区紧跟在文件系统保留区后,所以FAT1在文件系统中的位置能够通过引导记录中偏移0x0E~0x0F字节处的“保留扇区数”得到,如存储器结构体图中M值。

2.2.2.2 FAT表分析说明

FAT32中每一个簇的簇地址是有32bit(4个字节),FAT表中的全部字节位置以4字节为单位进行划分,进行地址编号。0号地址与1号地址被系统保留并存储特殊标志内容。从2号地址開始,每一个地址相应于数据区的簇号,FAT表中的地址编号与数据区中的簇号同样。我们称FAT表中的这些地址为FAT表项,FAT表项中记录的值称为FAT表项值。

当文件系统被创建,也就是进行格式化操作时,分配给FAT区域的空间将会被清空,在FAT1与FAT2的0号表项与1号表项写入特定值。因为创建文件系统的同一时候也会创建根文件夹,也就是为根文件夹分配了一个簇空间,通常为2号簇,与之相应的2号FAT表项记录为2号簇,被写入一个结束标记。

几点说明:

Ø 因为簇号起始于2号,所以FAT表项的0号表项与1号表项不与不论什么簇相应。FAT32的0号表项值总是“F8FFFF0F”。

Ø 1号表项可能被用于记录脏标志,以说明文件系统没有被正常卸载或者磁盘表面存在错误。只是这个值并不重要。正常情况下1号表项的值为“FFFFFFFF”或“FFFFFF0F”。

Ø 假设某个簇未被分配使用,它相应的FAT表项内容为0;

Ø 当某个簇已被分配使用,则它相应的FAT表项内的FAT表项值也就是该文件的下一个存储位置的簇号。假设该文件结束于该簇,则在它的FAT表项中记录的是一个文件结束标记,对于FAT32而言,代表文件结束的FAT表项值为0x0FFFFFFF。

Ø 假设某个簇存在坏扇区,则整个簇会用0xFFFFFF7标记为坏簇,这个坏簇标记就记录在它所相应的FAT表项中。

Ø 在文件系统中新建文件时,假设新建的文件仅仅占用一个簇,为其分配的簇相应的FAT表项将会写入结束标记。假设新建的文件不仅仅占用一个簇,则在其所占用的每一个簇相应的FAT表项中写入为其分配的下一簇的簇号,在最后一个簇相应的FAT表象中写入结束标记。

Ø 新建文件夹时,仅仅为其分配一个簇的空间,相应的FAT表项中写入结束标记。当文件夹增大超出一个簇的大小时,将会在空暇空间中继续为其分配一个簇,并在FAT表中为其建立FAT表链以描写叙述它所占用的簇情况。

2.2.2.3 FAT表演示样例

【0号表项】:0x0FFFFFF8;FAT表起始固定标识

【1号表项】:0xFFFFFFFF;不是用,默认值

【2号表项】:0x0FFFFFFF;根文件夹所在簇,

号表项,绿色的为4号表项,以此类推。注意:0和1号表项均不与实际的物理地址相应,2号表项開始才与物理地址相应。2号表项物理地址为FAT2表后紧跟着的那个簇!3号在2号表项紧跟着的一个簇。

(0x1D75);FAT2起始扇区为38+7541=7579;根文件夹起始扇区在7579 + 7541 = 15120。记得本文8个扇区为一个簇,即4K(0x1000),簇是系统分配内存的最小单元。

如图表中的起始地址对照,发现根文件夹起始地址刚好在15120,所以FAT表中0和1号表项没有相应物理地址!

图9

我将SD格式化,新建了一个test.txt的文本文件,大小为8.2kB。例如以下图:

图10

我们来分析上图:

,这个地址是我们根文件夹(2号簇)后的一个簇,所以test.txt文件起始簇是3号簇,也就是3号表项(FAT表中表项值与簇号相应)。

【1】:2号表项为根文件夹,即2号簇。

【2】:3号表项为-0x00 00 00 04,test文件的下一簇号在4号表项,查看4号表项。

【3】:4号表项为-0x00 00 00 05,test文件下一簇号在5号表项,查看5号表项。

【4】:5号表项为-0x0F FF FF FF,结束符号。说明文件在5号簇时就存储完成。

2.2.3 数据区(灰色区域)

数据区时真正用于存放用户数据的区域。数据区紧跟在FAT2之后,被划分成一个个的簇。全部的簇从2開始进行编号,也就是说,2号簇的起始位置就是数据区的起始位置。

2.2.3.1 根文件夹

FAT表演示样例中,根文件夹截图:

图11

尽管原则上FAT32同意根文件夹位于数据区的不论什么位置,但通常情况下它都位于数据区起始扇区,2号簇,能够在号簇)的位置,它不是位于文件系统開始处,而是位于数据区。从前面的学习知道,在数据区前面是保留区域和FAT区域,在前面还有MBR区域,这些区域都不使用FAT表进行管理。因此,数据区曾经的区域仅仅能使用扇区地址,而无法使用簇地址。

事实上在2.2.2.3节,FAT表演示样例中我们就已经计算过事实上地址(),注意这个地址不是物理地址哦,仅仅是在FAT文件区域中一个相对地址!由于在之前还有MBR保留区域!

【保留区域大小(绿色部分)】:DBR偏移地址0x0E~0x0F,38(0x26),

【FAT表个数】:DBR偏移地址0x10開始2字节,2个,

),

说明:以上值均參见2.2.1.1节。

【计算公式】:

数据区起始扇区号 = 保留扇区数 + 每一个FAT表大小扇区数 × FAT表个数

【演示样例】: 数据区起始扇区号 = 38 + 7541*2 = 15120

为了避免根文件夹被更改,也能够用以下的计算公式计算出根文件夹扇区:

根文件夹起始扇区=保留扇区数+FAT×2+(根文件夹起始簇-2)x每簇的扇区数。

说明:1、假设要得到物理地址,须要加上MBR保留区域大小。

2.2.3.2 根文件夹的短文件文件夹项定义

文件夹所在的扇区,都是以32 Bytes划分为一个单位,每一个单位称为一个文件夹项(Directory

Entry ),即每一个文件夹项的长度都是32 Bytes 。根文件夹由若干个文件夹项组成,一个文件夹项占用32个字节,能够是长文件名称文件夹项、文件文件夹项、子文件夹项等。32字节的详细定义例如以下图:

图12

演示样例:

图13

特别关注的參数说明:

【1】:文件或者目录存储的起始簇号,上图中紫色区域,偏移地址:0x14-0x15(高16为)和0x1A-0x1B(低16位),0x 00 00 00 03 ,表示这个文件存储在3号簇的位置,在FAT表中为3号表项。

【2】:文件大小:偏移地址0x1C-0x1F,0x 00 00 20 EE(8430字节);

【3】文件属性:偏移地址0x0B-0x0B,0x20 ,归档。

其它说明:

【0】子文件夹存储在数据区

【1】文件名称的第一个字节,为0xE5,表示该项已被删除。

【2】名字为0x2E(“.”),表示当前文件夹。

图14

【3】名字为0x2E 0x2E(“. .”),表示上一级文件夹。

2.2.3.3 长文件文件夹定义

图15

点击链接下载本文的pdf版:http://download.csdn.net/detail/mjx91282041/5348397

SD卡中FAT32文件格式高速入门(图文具体介绍)的更多相关文章

  1. SD卡中FAT32文件格式快速入门(图文详细介绍)【转】

    本文转自:http://blog.csdn.net/mjx91282041/article/details/8904705 说明: MBR :Master Boot Record ( 主引导记录) D ...

  2. SD卡中FAT32文件格式快速入门(图文详细介绍)

    说明: MBR :Master Boot Record ( 主引导记录) DBR :DOS Boot Record ( 引导扇区) FAT :File Allocation Table ( 文件分配表 ...

  3. SD卡与FAT32系统学习

    2011-06-06 23:04 前2天,我了解了一下SD卡驱动的原理及FAT32文件系统的结构.接着准备主要已移植为主.通过LCD显示SD卡中的图片.但我需要分步进行. 0,使sd卡能读写数据.1, ...

  4. 【记录】尝试用android-logging-log4j去实现log输出内容到sd卡中的文件的功能

    [背景] 折腾: [记录]给Android中添加log日志输出到文件 期间,已经试了: [记录]尝试用android中microlog4android实现log输出到文件的功能 但是不好用. 然后就是 ...

  5. Android中使用SQLiteOpenHelper管理SD卡中的数据库

    使用Android中自带的SQLiteOpenHelper可以完成数据库的创建与管理,但有两点局限: (1)数据库创建在内存卡中,大小受限,创建位置位于/data/data/应用程序名/databas ...

  6. 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件

    [源码下载] 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件 作者:w ...

  7. Android--手持PDA读取SD卡中文件

    近两年市场上很多Wince设备都开始转向Android操作系统,最近被迫使用Android开发PDA手持设备.主要功能是扫描登录,拣货,包装,发货几个功能.其中涉及到商品档的时候大概有700左右商品要 ...

  8. android 读取sd卡中的图片

    一.获取读取SD卡的权限 <!--在SDCard中创建与删除文件权限  -->    <uses-permission android:name="android.perm ...

  9. 转-Android 之 使用File类在SD卡中读取数据文件

    如果需要在程序中使用sdcard进行数据的存储,那么需要在AndroidMainfset.xml文件中 进行权限的配置: Java代码:   <!-- 在sd中创建和删除文件的权限 --> ...

随机推荐

  1. Asp.Net WebAPI 中Cookie 获取操作方式

    1. /// <summary> /// 获取上下文中的cookie /// </summary> /// <returns></returns> [H ...

  2. 常用hash函数

    常用的哈希函数   通用的哈希函数库有下面这些混合了加法和一位操作的字符串哈希算法.下面的这些算法在用法和功能方面各有不同,但是都可以作为学习哈希算法的实现的例子.   1.RS  从Robert S ...

  3. iOS 8 自动布局sizeclass和autolayout的基本使用

    1.首先创建新的工程,设置rootviewcontroller(这里不再多说) 2.勾选下面(因为我们到下面是使用sizeClass,所以勾选两个): 3.这里我创建了一个lable,名称为View1 ...

  4. Swift - 39 - 枚举类型关联默认值

    //: Playground - noun: a place where people can play import UIKit enum Month: Int { // 这么定义, 后面的Feb, ...

  5. Ubuntu下搭建本地WordPress站点

    想在本地搭建WordPress博客站点作测试用?本教程一步一步教您在Linux上搭建一个LAMP(Linux, Apache, MySQL, PHP)服务器并部署WordPress博客. 请注意在复制 ...

  6. C++是怎么实现多态性的

    C++是怎么实现多态性的,C++中多态实现的原理, 当一个类中有虚函数时,系统会为该类构造一个虚函数表vtable,他是一个指针数组,存放每个虚函数的入口地址,编译器还会在此类中隐含插入一个指针vpt ...

  7. 如何访问google

    http://www.williamlong.info/archives/3983.html http://jingyan.baidu.com/article/29697b91316f2fab20de ...

  8. mysql 索引管理原则

    最近在学习mysql的索引优化,结合着我们网盟系统的一些业务,翻阅一些资料,整理出如下的一些想法: 1.索引建立的原则一:最左前缀匹配原则 ,非常重要的原则,mysql会一直向右匹配直到遇到范围查询( ...

  9. 最难忘的Bug调试经历

    摘要:目前,著名的社区问答网站Quora上出现一个很火的讨论:你调试过最难的Bug是什么?大家纷纷留言,把自己最痛苦的一次调试经验写下来. 相信每位程序员都有过一段不堪回首地Bug调试经历,程序员一听 ...

  10. VLC测试IPv4 IGMP/IPv6 MLD协议

    1 简述 VLC既可以充当流客户端,又可以充当流服务器,并且可以跨平台使用,是一款开源.免费的软件,基于GNU GPL许可证. 2 搭建组播服务器 第一步:运行程序后选择“媒体  串流”:第二步:通过 ...