搜索
当前位置: 三分彩网站 > 段地址 >

SD卡FAT16文件系统的学习笔记

gecimao 发表于 2019-06-11 19:01 | 查看: | 回复:

  根据文件的起始数据簇编号在FAT表中查找所有该文件占用的数据簇及数据簇访问的先后关系。

  先读取SD卡的第一个扇区(512字节),即扇区0,然后该扇区最后部分的数据如下图所示

  正常的话,该扇区最后两个字节如上图所示为55 AA,如果不是则证明是读错了,或者该SD没有被格式化。

  二、在0x1c6开始的四个字节61 00 00 00,即0x61=97,它表示引导扇区在扇区97。那我们就接着读扇区97,获取SD卡里更详细的信息,这个扇区0就可以不用管了。

  以下是扇区97前64Byte的内容。因为97*512=0xc200,所以可以下图左边的偏移地址为c200

  接下来的04 00 即0x4代表有4-1个保留扇区,即是第一个FAT表所在扇区为引导扇区(97)+4=扇区101

  知道以上的信息之后我们就可以根据以上信息计算出FAT1,FAT2,FDT和数据簇的首地址和结束地址,但在计算之前,我有必要介绍一下整个FAT16文件系统的结构和各个区的含义与作用。

  现在既然已经大概了解了引导扇,FAT1,FAT2,FDT和数据簇的作用,接下来就说一下怎么计算它们的起始地址和结束地址。我们用扇区来作为地址单位。

  由之前的知识可以知道,我们首先从物理扇区0知道SD_offset.Logic的地址,然后就可以找到引导扇.然后再在引导扇里找到SD_para里面所有变量的值。

  一个FDT表占32个扇区,共有512个文件登记信息,所以每个文件登记信息的大小为32*512/512=32Byte

  第0x1a到0x1b个字节道标文件开始的首簇号,知道文件的首簇号我们就可以查看FAT表的相应信息,就可得到该文件所占用的所有数据簇的簇号。

  上表中,06、07单元映射了磁盘3号簇区。有之前的介绍中可以知道,我这张SD卡1个簇包含4个扇区。也就是说在写数据时,只有写完了3号簇的4个扇后,将FAT表的06,07单元填写04,00;才可继续在04号簇上写数据。如果数据写完后还没有写满3号簇,则在FAT表的06,07单元填写FF,FF.

  也就是说在FAT表中记录着每个数据簇的状态,且每个数据簇的状态占用两个字节。如果这两个字节等于0xffff,则代表该数据簇以被占用,且文件在该数据簇中结束。如果这两个字节等于0x0001~0xfffe,则代表该数据簇已被占用,且该文件没有结束,而该文件存放的下一数据簇的簇号就等于这两个字节的大小。

  下面以我的SD卡为例子,向大家介绍读写SD的FAT文件系统的文件(最好先安装一个叫做winhex的软件)。

  要打开我这个名为lqz.txt的文件的,我们先查找FDT表中关于lqz.txt这个文件的登记信息。

  因为之前已经知道了FDT的首地址是第585扇区,我们来到585扇区,开始搜索LQZ.TXT(必须先转换成大写字母)

  数据簇0x2fe4的信息就存放在0x129c8,和0x129c9这个字节里,从上图可以看出这两个字节等于0x46F4,也就是说LQZ.TXT存放的下一个数据簇的簇号为0x46F4,由于该文件占用6个数据簇,所以我们必须继续查找剩下的4个数据簇的簇号。我们继续查找簇号为0x46f4的数据簇在FAT表的信息,地址为0xca00+0x46f4*2=0x157e8

  由上图可以下一数据簇的簇号为0x46f5。然后按照上诉方法查找剩余三个簇号分别为0x46f6,0x46f7,0x46f8,最后在0x46f8对应的地方存放着0xffff,代表文件到此结束。

  经过上诉步骤我们知道我lqz.txt文件依次存放在0x2fe4,0x46f4,0x46f5,0x46f6,0x46f7,0x46f8这6个数据簇,接下来我们就读取这6个数据簇的内容即可。

本文链接:http://dogayoga.net/duandizhi/508.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部