操作体系: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。
主引导记载部分如下表:
偏移(字节) | 长度(字节) | 阐明 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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) | ||||||||||||||||
0x2c | 4 | 根目录启始簇(FAT32) | ||||||||||||||||
0x2b | 11 | 卷标(非FAT32) | ||||||||||||||||
0x30 | 2 | FSInfo扇区(FAT32) | ||||||||||||||||
0x32 | 2 | 发动扇区备份(FAT32) | ||||||||||||||||
0x34 | 12 | 保存未运用(FAT32) | ||||||||||||||||
0x36 | 8 | FAT文件体系类型(如FAT、FAT12、FAT16) | ||||||||||||||||
0x3e | 2 | 操作体系自引导代码 | ||||||||||||||||
0x40 | 1 | BIOS设备代号(FAT32) | ||||||||||||||||
0x41 | 1 | 未运用(FAT32) | ||||||||||||||||
0x42 | 1 | 符号(FAT32) | ||||||||||||||||
0x43 | 4 | 卷序号(FAT32) | ||||||||||||||||
0x47 | 11 | 卷标(FAT32) | ||||||||||||||||
0x52 | 8 | FAT文件体系类型(FAT32) | ||||||||||||||||
0x1FE | 2 | 扇区完毕符(0x55 0xAA) |
DPT分区表:
表1 图2分区表榜首字段 | |||
字节位移 | 字段长度 | 值 | 字段名和界说 |
0x01BE | BYTE | 0x80 | 引导指示符(Boot Indicator) 指明该分区是否是活动分区。 |
0x01BF | BYTE | 0x01 | 开端磁头(Starting Head) |
0x01C0 | 6位 | 0x01 | 开端扇区(Starting Sector) 只用了0~5位。后边的两位(第6位和第7位)被开端柱面字段所运用 |
0x01C1 | 10位 | 0x00 | 开端柱面(Starting Cylinder) 除了开端扇区字段的最终两位外,还运用了1位来组成该柱面值。开端柱面是一个10位数,最大值为1023 |
0x01C2 | BYTE | 0x07 | 体系ID(System ID) 界说了分区的类型,具体界说,请参阅图4 |
0x01C3 | BYTE | 0xFE | 完毕磁头(Ending Head) |
0x01C4 | 6位 | 0xFF | 完毕扇区(Ending Sector) 只运用了0~5位。最终两位(第6、7位)被完毕柱面字段所运用 |
0x01C5 | 10位 | 0x7B | 完毕柱面(Ending Cylinder) 除了完毕扇区字段最终的两位外,还运用了1位,以组成该柱面值。完毕柱面是一个10位的数,最大值为1023 |
0x01C6 | DWORD | 0x0000003F | 相对扇区数(Relative Sectors) 从该磁盘的开端到该分区的开端的位移量,以扇区来核算 |
0x01CA | DWORD | 0x00DAA83D | 总扇区数(Total Sectors) 该分区中的扇区总数 |
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/317500.html