



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、 读文件的流程1. 读物理扇区0,得到引导扇(逻辑扇区0)的偏移地址。2. 读引导扇的内容,得到文件系统基本配置信息。3. 根据文件系统的基本配置信息计算FAT,FDT,数据簇的起始地址和大小。4. 根据要读的文件名搜索FDT表,找到要读文件的起始数据簇编号,大小。5. 根据文件的起始数据簇编号在FAT表中查找所有该文件占用的数据簇及数据簇访问的先后关系。6. 读取该文件的起始数据簇的内容,及下一数据簇内容(有需要时)。二、 读取物理扇区0先读取SD卡的第一个扇区(512字节),即扇区0,然后该扇区最后部分的数据如下图所示 正常的话,该扇区最后两个字节如上图所示为55 AA,如果不是则证明是读错了,或者该SD没有被格式化。该扇区有两个重要信息:一、 在0x1ca开始的四个字节9f c9 03 00,即0x3c99f=248223,代表该SD卡友248223个扇区,因为每个扇区有512字节,所以该SD卡容量为248223*512/1024/1024=121.2MByte二、在0x1c6开始的四个字节61 00 00 00,即0x61=97,它表示引导扇区在扇区97。那我们就接着读扇区97,获取SD卡里更详细的信息,这个扇区0就可以不用管了。三、 读取引导扇区以下是扇区97前64Byte的内容。因为97*512=0xc200,所以可以下图左边的偏移地址为c200 首先第0x3到0xA的内容为ASCII码的“MSDOS5.0”,不是重要信息第0xb开始的两个字节00 02,即0x2000=512,代表每个扇区(sector)有512个字节(byte)接下来的04代表每个簇(cluster)有4个扇区接下来的04 00 即0x4代表有4-1个保留扇区,即是第一个FAT表所在扇区为引导扇区(97)+4=扇区101接下来的02 代表有两个FAT表接下来的00 02,即0x2000=512,代表FDT(目录区)有512登记项第0x16开始的两个字节f2 00,即0xf2=242,代表每个FAT表占242个扇区第0x36到0x3d代表的就是“FAT16 ”的ASCII码,说明这SD卡是FAT16的格式四、 FAT16文件系统的结构知道以上的信息之后我们就可以根据以上信息计算出FAT1,FAT2,FDT和数据簇的首地址和结束地址,但在计算之前,我有必要介绍一下整个FAT16文件系统的结构和各个区的含义与作用。 五、 获取文件系统基本配置信息现在既然已经大概了解了引导扇,FAT1,FAT2,FDT和数据簇的作用,接下来就说一下怎么计算它们的起始地址和结束地址。我们用扇区来作为地址单位。我们首先定义两个结构体typedef struct U16 BytesPerSector;/每个扇区多少字节U8 SectorsPerCluster; /每个簇有多少个扇区U16 ReserveSectors;/保留扇区数U8 FatTableNums;/有多少个FAT表U16 RootDirRegNums; /根目录允许的登记项数目U16 SectorsPerFat; /每个FAT表有多少个扇区U32 SectorNums;/总的扇区数U8FileType7; /文件系统类型FAT_PARA;typedef structU32 Logic; /引导扇(逻辑扇区0)对物理0扇区里的偏移地址U32 FAT1;U32 FAT2;U32 FDT;U32 Cluster; /数据簇的偏移地址FAT_OFFSET;FAT_PARA SD_para; /声明两个结构体变量FAT_OFFSETSD_offset;由之前的知识可以知道,我们首先从物理扇区0知道SD_offset.Logic的地址,然后就可以找到引导扇.然后再在引导扇里找到SD_para里面所有变量的值。U8 buffer512;Read_Single_Block(0, buffer);/把物理扇区0的512个字节的数据读到buffer里SD_offset.Logic = (* (U16 *) (buffer + 0x1c6) + (* (U16 *) (buffer + 0x1c8) 16); /得到引导扇的偏移地址Read_Single_Block(SD_offset.Logic, buffer) ; /读引导扇的数据/获取参数,以便计算各个区的偏移地址SD_para.BytesPerSector = (* (U8 *) (buffer + 0xb) + (* (U8 *) (buffer + 0xc) 8); SD_para.SectorsPerCluster = * (buffer + 0x0d);SD_para.ReserveSectors = * (U16 *) (buffer + 0x0e);SD_para.FatTableNums = * (buffer + 0x10);SD_para.RootDirRegNums = (* (U8 *) (buffer + 0x11) + (* (U8 *) (buffer + 0x12) 8);SD_para.SectorsPerFat = * (U16 *) (buffer + 0x16);SD_para.SectorNums = * (U32 *) (buffer + 0x20);for(i = 0; i 6; i+)SD_para.FileTypei = *(buffer+0x36+i);SD_para.FileType6 = 0;六、 计算各重要区域的大小与起始地址/计算各个区的偏移地址/FAT1地址=引导扇地址+保留扇区数,大小为SD_para.SectorsPerFatSD_offset.FAT1 = SD_offset.Logic + SD_para.ReserveSectors; /如果存在两个FAT表,一般不是1就是2if (SD_para.FatTableNums = 2) /FAT2地址=FAT1地址+ SD_para.SectorsPerFatSD_offset.FAT2 = SD_offset.FAT1 + SD_para.SectorsPerFat; else SD_offset.FAT2 = 0;/FDT地址=FAT1+FAT表数*FAT表大小SD_offset.FDT=SD_offset.FAT1+SD_para.FatTableNums*SD_para.SectorsPerFat; /因为数据簇2紧跟在FDT后,所以数据簇0易求得 SD_offset.Cluster = SD_offset.FDT + 32 - 2 * SD_para.SectorsPerCluster; 七、 FDT与FAT表的简单介绍读取文件之前要先详细了解一下FDT,和FAT表的内容 一个FDT表占32个扇区,共有512个文件登记信息,所以每个文件登记信息的大小为32*512/512=32Byte每个文件登记信息如下图所示 对于我们来说,这个文件记录信息最重要的就是最后六个字节最后四个字节代表文件大小,由文件大小可以推算出该文件占用多少个数据簇第0x1a到0x1b个字节道标文件开始的首簇号,知道文件的首簇号我们就可以查看FAT表的相应信息,就可得到该文件所占用的所有数据簇的簇号。以下是FAT表的结构 上表中,06、07单元映射了磁盘3号簇区。有之前的介绍中可以知道,我这张SD卡1个簇包含4个扇区。也就是说在写数据时,只有写完了3号簇的4个扇后,将FAT表的06,07单元填写04,00;才可继续在04号簇上写数据。如果数据写完后还没有写满3号簇,则在FAT表的06,07单元填写FF,FF.也就是说在FAT表中记录着每个数据簇的状态,且每个数据簇的状态占用两个字节。如果这两个字节等于0xffff,则代表该数据簇以被占用,且文件在该数据簇中结束。如果这两个字节等于0x00010xfffe,则代表该数据簇已被占用,且该文件没有结束,而该文件存放的下一数据簇的簇号就等于这两个字节的大小。八、 读取一个文件 下面以我的SD卡为例子,向大家介绍读写SD的FAT文件系统的文件(最好先安装一个叫做winhex的软件)。首先我的SD卡存放着这样一个文件 要打开我这个名为lqz.txt的文件的,我们先查找FDT表中关于lqz.txt这个文件的登记信息。因为之前已经知道了FDT的首地址是第585扇区,我们来到585扇区,开始搜索LQZ.TXT(必须先转换成大写字母) 最后在地址为0x4a310(也就是第0x4a310/512=593扇区)的地方搜索到LQZ.TXT的文件登记信息,在最后四个字节得知该文件大为0x00002c89=11401Byte,占用11401/512/4=6个数据簇,从倒数第5,6个字节可以知道文件的首簇号为0x2fe4,然后在FAT表根据文件的首簇号查找接下来文件占用的五个数据簇簇号,数据簇0x2fe4在FAT的登记位置=FAT地址+0xfe4*2=0xca00+0x2fe4*2=0x129c8,我们来到0x129c8这个地址 数据簇0x2fe4的信息就存放在0x129c8,和0x129c9这个字节里,从上图可以看出这两个字节等于0x46F4,也就是说LQZ.TXT存放的下一个数据簇的簇号为0x46F4,由于该文件占用6个数据簇,所以我们必须继续查找剩下的4个数据簇的簇号。我们继续查找簇号为0x46f4的数据簇在FAT表的信息,地址为0xca00+0x46f4*2=0x157e8 由上图可以下一数据簇的簇号为0x46f5。然后按照上诉方法查找剩余三个簇号分别为0x46f6,0x46f7,0x46f8,最后在0x46f8对应的地方存放着0xffff,代表文件到此结束。经过上诉步骤
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 购买建房土地合同(标准版)
- 果树苗木基地创新创业项目商业计划书
- 2025版长期租赁合同样本
- 奶牛节水养殖技术创新创业项目商业计划书
- 2025授权合同样本:软件许可使用合同
- 无公害蔬菜物流配送创新创业项目商业计划书
- 建屋合同(标准版)
- 南京安全员培训及答案
- 2025合同设备修理合同范本
- 2025年私人租房协议
- 高校实验室安全基础课(实验室准入教育)学习通网课章节测试答案
- 2025年山东省安全员C证(专职安全员)考试题库
- GB/T 3871.9-2006农业拖拉机试验规程第9部分:牵引功率试验
- GB/T 3836.4-2021爆炸性环境第4部分:由本质安全型“i”保护的设备
- GB 17840-1999防弹玻璃
- 文学鉴赏-课件
- 小军师面试万能绝杀模板-组织管理
- midasCivil斜拉桥分析课件
- 应急响应程序流程图
- 牡蛎在肾病科的应用总结
- 腧穴定位法课件
评论
0/150
提交评论