用单片机的RAM虚拟U盘(文件系统:Fat16)
文件系统:Fat16
硬件平台:stm32f103c8
描述:利用mcu的ram虚拟一个U盘,用于存储即时小数据,通过usb以u盘的方式供上位机读取。
一:硬盘篇
1、硬盘物理结构:
盘片(platter):硬盘由很多盘片组成,每个盘片的每个面都有一个读写磁头(heads)。N个盘片,就有2N个面,对应2N个磁头,从0、1、2……开始编号;
磁道:同一个盘片不同半径的同心圆为磁道(注意,是指圆周线或圆环);
柱面(cylinders):不同盘片相同的磁道,构成柱面,由外至里编号0、1、2……
扇区(sector):每道磁道被划分成几十个扇区,通常,一个扇区容量为512B,并按照一定规则编号1、2、3……
簇:另外,由于扇区实在太多了,文件分配表没办法一一描述,所以,就把一定数量的扇区分为一个簇。所以文件系统是以一簇为最小单位的。
注意:磁头和柱面都是从0开始编号的,扇区搞毛特殊从1开始。
总扇区数量=柱面数×磁头数×每道扇区
2、磁盘引导:
下图是一个4个分区的硬盘,开头的主引导记录就是上面介绍的MBR,其中4个分区表分别指出了4个分区的位置,上位机获取MBR之后,就知道了硬盘的总体结构,包括硬盘的大小、每个分区的位置、每个分区的大小等等。
隐藏区(hidden sector):在分区之前的部分,而下面介绍的MBR就是隐藏区的第一个扇区。隐藏区不是必须的,它和系统启动有关,如果仅仅是作为存储,那么隐藏区可以没有。比如,标题说的用RAM虚拟的U盘。
注意:在我理解中,严格地说,隐藏区应该是指每个分区之内,位于保留区之前的扇区,也就是说,每个分区都有一套隐藏区+保留区。只是在唯一存储介质的第一个分区的隐藏区才是必须的,因为它需要用于系统的启动。而其他分区的隐藏区则一般被省略。如果不被省略,比如SD的开头就有一部分隐藏区,这时,引导代码部分是空的(因为不需要它来做系统启动),只有DPT分区表才有意义,用于划分SD的分区情况。
MBR(master boot record)扇区:即主引导记录,有时也叫主引导扇区,位于硬盘的0柱面0磁头1扇区,也就是所谓是第0扇区,也是整个存储介质的首个扇区。其中前446字节为引导程序,紧跟着的是64字节的硬盘分区表DPT,最后2个字节是“0x55 0xAA”,为磁盘有效结尾标志。
MBR 是不随操作系统的不同而不同的,具有公共引导特性。(在双系统中,一般先装Windows再装linux,原因是,linux会修改这段代码,让用户可以选择进去哪个系统,但Windows却是没有,如果后装Windows,那么linux的引导就会被忽略??)
(1)0x000-0x1bd:mbr引导代码(有些地方也叫MBR??),446字节,pc的bios执行完自举之后,会将cpu控制权交给此间的446个字节的loader程序;
(2)0x1be-0x1fd:DPT分区表,64字节,每16字节描述一个分区,所以硬盘的主分区+扩展分区不能大于4个,另外扩展分区数不能大于1。(现实中,不止4个,其实是扩展分区里面分出来的逻辑分区,对于逻辑分区的问题上面的链接也有提到,可以参考。)
0x1fe-0xff:0x55 0xAA。
主引导记录部分如下表:
偏移(字节) | 长度(字节) | 说明 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x00 | 3 | 跳转指令(跳过开头一段区域) | ||||||||||||||||
0x03 | 8 | OEM名称(空格补齐)。MS-DOS检查这个区域以确定使用启动记录中的哪一部分数据[3]。常见值是IBM 3.3(在“IBM”和“3.3”之间有两个空格)和MSDOS5.0. | ||||||||||||||||
0x0b | 2 | 每个扇区的字节数。基本输入输出系统参数块从这里开始。 | ||||||||||||||||
0x0d | 1 | 每簇扇区数 | ||||||||||||||||
0x0e | 2 | 保留扇区数(包括启动扇区) | ||||||||||||||||
0x10 | 1 | 文档分配表数目 | ||||||||||||||||
0x11 | 2 | 最大根目录条目个数 | ||||||||||||||||
0x13 | 2 | 总扇区数(如果是0,就使用偏移0x20处的4字节值) | ||||||||||||||||
0x15 | 1 | 介质描述
同样的介质描述必须在重复复制到每份FAT的第一个字节。有些操作系统(MSX-DOS 1.0版)全部忽略启动扇区参数,而仅仅使用FAT的第一个字节的介质描述确定文件系统参数。 | ||||||||||||||||
0x16 | 2 | 每个文档分配表的扇区(FAT16) | ||||||||||||||||
0x18 | 2 | 每磁道的扇区 | ||||||||||||||||
0x1a | 2 | 磁头数 | ||||||||||||||||
0x1c | 4 | 隐藏扇区 | ||||||||||||||||
0x20 | 4 | 总扇区数(如果超过65535,参见偏移0x13) | ||||||||||||||||
0x24 | 4 | 每个文档分配表的扇区(FAT32)。扩展基本输入输出系统参数块从这里开始。 | ||||||||||||||||
0x24 | 1 | 物理驱动器个数(FAT16) | ||||||||||||||||
0x25 | 1 | 当前磁头(FAT16) | ||||||||||||||||
0x26 | 1 | 签名(FAT16) | ||||||||||||||||
0x27 | 4 | ID(FAT16) | ||||||||||||||||
0x28 | 2 | Flags(FAT32) | ||||||||||||||||
0x2a | 2 | 版本号(FAT32) |
单片机RAM虚拟U 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)