微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 用单片机的RAM虚拟U盘(文件系统:Fat16)

用单片机的RAM虚拟U盘(文件系统:Fat16)

时间:12-01 来源:互联网 点击:
操作系统:rt-thread

文件系统: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。

主引导记录部分如下表:

偏移(字节)长度(字节)说明
0x003跳转指令(跳过开头一段区域)
0x038OEM名称(空格补齐)。MS-DOS检查这个区域以确定使用启动记录中的哪一部分数据[3]。常见值是IBM 3.3(在“IBM”和“3.3”之间有两个空格)和MSDOS5.0.
0x0b2每个扇区的字节数。基本输入输出系统参数块从这里开始。
0x0d1每簇扇区数
0x0e2保留扇区数(包括启动扇区)
0x101文档分配表数目
0x112最大根目录条目个数
0x132总扇区数(如果是0,就使用偏移0x20处的4字节值)
0x151介质描述
0xF8单面、每面80磁道、每磁道9扇区
0xF9双面、每面80磁道、每磁道9扇区
0xFA单面、每面80磁道、每磁道8扇区
0xFB双面、每面80磁道、每磁道8扇区
0xFC单面、每面40磁道、每磁道9扇区
0xFD双面、每面40磁道、每磁道9扇区
0xFE单面、每面40磁道、每磁道8扇区
0xFF双面、每面40磁道、每磁道8扇区

同样的介质描述必须在重复复制到每份FAT的第一个字节。有些操作系统(MSX-DOS 1.0版)全部忽略启动扇区参数,而仅仅使用FAT的第一个字节的介质描述确定文件系统参数。

0x162每个文档分配表的扇区(FAT16)
0x182每磁道的扇区
0x1a2磁头数
0x1c4隐藏扇区
0x204总扇区数(如果超过65535,参见偏移0x13)
0x244每个文档分配表的扇区(FAT32)。扩展基本输入输出系统参数块从这里开始。
0x241物理驱动器个数(FAT16)
0x251当前磁头(FAT16)
0x261签名(FAT16)
0x274ID(FAT16)
0x282Flags(FAT32)
0x2a2版本号(FAT32)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top