用单片机的RAM虚拟U盘(文件系统:Fat16)
10-5 | 分钟(0-59) |
4-0 | 秒/2(0-29) |
注意秒只保存了2秒的分辨率。更细分辨率的文档创建时间在偏移0x0d处。
位 | 描述 |
---|---|
15-9 | 年(0 = 1980, 127 = 2107) |
8-5 | 月(1 = 1月,12 = 12月) |
4-0 | 日(1 - 31) |
目录项接着的第一个扇区就是真正存放文件数据或是目录的位置了。
二:FAT16
维基百科:http://en.wikipedia.org/wiki/Fat16
其实和上面的介绍差不多。不过这是从文件系统逻辑概念来解释,而前面更偏于物理位置。
保留区 | 文档 分配表#1 | 文档 分配表#2 | 根目录 | 其他所有数据... 剩下磁盘空间 |
- 保留扇区,位于最开始的位置。第一个保留扇区是引导区DBR(分区启动记录)。它包括一个称为基本输入输出参数块的区域(包括一些基本的文件系统信息尤其是它的类型和其它指向其它扇区的指针),通常包括操作系统的启动调用代码。保留扇区的总数记录在引导扇区中的一个参数中。引导扇区中的重要信息可以被DOS和OS/2中称为驱动器参数块的操作系统结构访问。
- FAT区域。它包含有两份文档分配表,这是出于系统冗余考虑,尽管它很少使用,即使是磁盘修复工具也很少使用它。它是分区信息的映射表,指示簇是如何存储的。
- 根目录区域。它是在根目录中存储文档和目录信息的目录表。在FAT32下它可以存在分区中的任何位置,但是在早期的版本中它永远紧随FAT区域之后。
- 数据区域。这是实际的文档和目录数据存储的区域,它占据了分区的绝大部分。通过简单地在FAT中添加文档链接的个数可以任意增加文档大小和子目录个数(只要有空簇存在)。然而需要注意的是每个簇只能被一个文档占有,这样的话如果在32KB大小的簇中有一个1KB大小的文档,那么31KB的空间就浪费掉了。
总结:拿SD卡来讲吧,给xp格式化之后的SD卡物理结构如下:隐藏区+保留区+FAT+副FAT+根目录区+数据区 1、隐藏区:包括MBR(主引导记录)和DPT(分区表),不过这里的MBR是空的,因为不需要它的系统启动。上位机首先读取这个512字节,根据DPT,知道分区情况,根据这些接着直接跳到第一分区的位置读取第一个分区; 2、保留区和FAT:这是上位机读取分区的第一部分内容,从而知道分区的情况,根据BDR知道根目录的位置;然后去读根目录。 3、根目录区:读取分区的根目录,可以知道分区的文件结构,然后根据对应的FAT,读到一个文件的内容。注意,在根目录里记录了文件的开始扇区,而这个逻辑开始扇区,是以2开头的,估计0和1已经被保留所用。
前面说了一大堆关于FAT16和硬盘的东西,其实是为下面做准备的。因为我觉得用RAM虚拟U盘,一要熟悉fat,二要熟悉USB协议。
前面介绍fat,下面应该就说USB了,但我对USB的了解非常肤浅,没办法从协议的角度来记录,只能简单的针对这次开发记录一下,以备后用吧。
1、要了解USB的设备、配置、接口、端点等知识点,和对应的各种描述符;
2、然后了解枚举的过程,数据线D+,D-,差分数据传输,NRZI编码,还有一些数据包;
3、一个很好用的总线监控软件,可以用它来监控USB的通信过程,对开发很有用:Bus Hound;
4、USB设备分类:显示器Monitors,通讯设备Communication device, 音频设备Audio,人机输入Human input,海量存储Mass storage。而这次我们用的应该就是Mass storage;
……
本程序是从一个MSD卡程序中改过来的,准确来说应该是奋斗版的U盘程序修改过来的。
关键点:
1、建立DBR数组(操作系统引导记录):
扇区大小:512;
每簇扇区数:1;
保留扇区数:1;
根目录项:16,因为16×32,刚好一个扇区;
小扇区数:8,因为用RAM虚拟的U盘,自然很小,其实我只用到5个扇区;
每FAT扇区数:1;
隐藏扇区数:0,因为不需要MBR,主引导记录;
大扇区数:0,fat16小容量没有用到;
2、FAT数组
FAT表以“F8 FF FF FF”开头,为介质描述单元。接着每2字节代表一簇,不过簇的标号是从2开始的,也就是说FAT表的4、5字节代表第2簇(顺序其实就是首簇),6、7字节代表第3簇,以此类推;
我现在fat表如下:
F8 FF FF FFFF FF00 00 ……
绿色就是代表第2簇,它的值代表文件的占用的下一个簇的簇号,ffff表示这是文件的最后一个簇。因为我们是一个小文件,一
单片机RAM虚拟U 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)