您的位置 首页 新能源

开发U盘的几点领会

如果你开发过USB相关项目,理解USB的一些基本概念,例如设备描述符、配置描述符、子类规范等,那么开发U盘只要概念清晰应该不难。以下是我开发过程中的几个相关步骤:保证USB 芯片正常工作,

  假如你开发过USB相关项目,了解USB的一些基本概念,例如设备描述符、装备描述符、子类规范等,那么开发U盘只需概念明晰应该不难。以下是我开发过程中的几个相关过程:

  确保USB 芯片正常作业,用其他USB成功项目验证硬件衔接及固件的正确性, 按Mass Storage协议Bulk-Only 形式供给描述符,使PC 机控制面板上设备类型呈现Mass Storage Device呼应SCSI指令会集Inquiry 指令,能够呈现盘符, 完结FAT16文件体系处理SCSI指令会集READ指令及其他UFI指令,能够拜访盘符处理SCSI指令会集WRITE指令, U盘开发成功开发U盘有三个工具软件应该必备:USBVIEW 观察设备描述符,端点测验等;BUSHOUND 截取USB总线数据,可剖析UFI指令及U盘回来的数据流;串口帮手可实时了解U盘所收指令流及程序流程, 因为每个人知识面不同,我想完结上面的几个过程遇到的问题也不相同。对我最大的困惑是完结FAT16文件体系,直到在微软网站找到它的白皮书才算解惑。这儿简介一下便利我们有的放矢。

  USB 安排界说了海量存储设备类(Mass Storage Class)的规范,这个类规范包括四个独立的子类规范,

  即:

  1. USB Mass Storage Class Control/Bulk/Interrupt (CBI) Transport

  2. USBMass Storage Class Bulk-Only Transport

  3. USB Mass Storage Class ATA Command Block

  4.USB Mass Storage Class UFI Command Specification。

  前两个子规范界说了数据/指令/状况在USB 上的传输办法。Bulk-Only 传输规范只是运用Bulk 端点传送数据/指令/状况,CBI 传输规范则运用Control/Bulk/Interrupt三种类型的端点进行数据/指令/状况传送。后两个子规范则界说了存储介质的操作指令。ATA 指令规范用于硬盘,UFI 指令规范是针对USB 移动存储。Windows95 OSR2和Windows 98开端支撑FAT32 文件体系,它是对前期DOS的FAT16文件体系的增强,因为文件体系的中心–文件分配表FAT由16位扩大为32位,所以称为FAT32文件体系。在一逻辑盘(硬盘的一分区)超越 512 兆字节时运用这种格局,会更高效地存储数据,削减硬盘空间的糟蹋,一般还会使程序运转加速,运用的计算机体系资源更少,因而是运用大容量硬盘存储文件的极有用的体系。自己对Windows 98下的FAT32 文件体系做了剖析试验,总体上与FAT16文件体系改变不大,现将有关改变部分简介如下:

  (一)FAT32 文件体系将逻辑盘的空间区分为三部分,顺次是引导区(BOOT区)、文件分配表区(FAT区)、数据区(DATA区)。引导区和文件分配表区又合称为体系区。

  (二)引导区从榜首扇区开端,运用了三个扇区,保存了该逻辑盘每扇区字节数,每簇对应的扇区数等等重要参数和引导记载。之后还留有若干保存扇区。而FAT16文件体系的引导区只占用一个扇区,没有保存扇区。

  (三)文件分配表区共保存了两个相同的文件分配表,因为文件所占用的存储空间(簇链)及闲暇空间的办理都是经过FAT完结的,FAT如此重要,保存两个以便榜首个损坏时,还有第二个可用。文件体系对数据区的存储空间是按簇进行区分和办理的,簇是空间分配和收回的基本单位,即,一个文件总是占用若干个整簇,文件所运用的终究一簇剩下的空间就不再运用,而是糟蹋掉了。从计算学上讲,均匀每个文件糟蹋0.5簇的空间,簇越大,存储文件时空间糟蹋越多,利用率越低。因而,簇的巨细决议了该盘数据区的利用率。FAT16体系簇号用16位二进制数表明,从0002H到FFEFH个可用簇号(FFF0H到FFFFH还有界说,用来表明坏簇,文件完毕簇等),答应每一逻辑盘的数据区最多不超越FFEDH(65518)个簇。FAT32体系簇号改用32位二进制数表明,大致从00000002H到FFFFFEFFH个可用簇号。FAT表按次序顺次记载了该盘各簇的运用状况,是一种位示图法。每簇的运用状况用32位二进制填写,未被分配的簇相应方位写零;坏簇相应方位填入特定值;已分配的簇相应方位填入非零值,详细为:假如该簇是文件的终究一簇,填入的值为FFFFFF0FH,假如该簇不是文件的终究一簇,填入的值为该文件占用的下一个簇的簇号,这样,正好将文件占用的各簇构成一个簇链,保存在FAT表中。0000000H、00000001H两簇号不运用,其对应的两个DWORD方位(FAT表最初的8个字节)用来寄存该盘介质类型编号。FAT表的巨细就由该逻辑盘数据区共有多少簇所决议,取整数个扇区。

  (四)FAT32体系一簇对应8个逻辑相邻的扇区,理论上,这种用法所能办理的逻辑盘容量上限为16TB(16384GB),容量大于16TB时,能够用一簇对应16个扇区,依此类推。FAT16体系在逻辑盘容量介于128MB到256MB时,一簇对应8个扇区,容量介于256MB到512MB时,一簇对应16个扇区,容量介于512MB到1GB时,一簇对应32个扇区,容量介于1GB到2GB时,一簇对应32个扇区,超出2GB的部分无法运用。明显,关于容量大于512MB的逻辑盘,选用FAT32的簇比选用FAT16的簇小许多,大大削减了空间的糟蹋。可是,关于容量小于512MB的盘,选用FAT32尽管一簇8个扇区,比运用FAT16一簇16个扇区,簇有所减小,但FAT32的FAT表较大,占用空间较多,总数据区被削减,两者相抵,实践并不能添加有用存储空间,所以微软主张对小于512M的逻辑盘不运用FAT32。别的,关于运用FAT16文件体系的用户提一主张,硬盘分区时,不要将分区(逻辑盘)容量正好设为某一区间的下限,例:将一逻辑盘容量设为1100M(稍大于1024M),则运用时其有用存储容量比分区为950M的一般还少,因其簇大一倍,糟蹋的空间较多。还有,运用FDISK等对分区指定容量时,因为对1MB的界说不相同(规范的二进制的1MB为1048576B,有的体系将1MB了解为1000000B,1000KB等),及每个分区需重新磁道开端等要素,实践分配的容量或许稍大于指定的容量,亦需留意把握。

  (五)根目录区(ROOT区)不再是固定区域、固定巨细,可看作是数据区的一部分。因为根目录已改为根目录文件,选用与子目录文件相同的办理方法,一般状况下从第二簇开端运用,巨细视需求添加,因而根目录下的文件数目不再受最多512的约束。FAT16文件体系的根目录区(ROOT区)是固定区域、固定巨细的,是从FAT区之后紧接着的32个扇区,最多保存512个目录项,作为体系区的一部分。

  (六)目录区中的目录项改变较多,一个目录项仍占32字节,能够是文件目录项、子目录项、卷标项(仅跟目录有)、已删去目录项、长文件名目录项等。目录项中本来在DOS下保存未用的10个字节都有了新的界说,悉数32字节的界说如下:

  (1) 0– 7字节 文件正名。

  (2) 8–10字节 文件扩展名。

  (3) 11字节 文件特点,按二进制位界说,最高两位保存未用,0至5位分别是只读位、躲藏位、体系位、卷标位、子目录位、归档位。

  (4) 12–13字节 仅长文件名目录项用,用来存储其对应的短文件名目录项的文件名字节校验和等。

  (5) 14–15字节 24位二进制的文件树立时刻,其间的高5位为小时,次6位为分钟。

  (6) 16–17字节 16位二进制的文件树立日期,其间的高7位为相关于1980年的年份值,次4位为月份,后5位为月内日期。

  (7) 18–19字节 16位二进制的文件最新拜访日期,界说同(6)。

  (8) 20–21字节 开端簇号的高16位。

  (9) 22–23字节 16位二进制的文件最新修正时刻,其间的高5位为小时,次6位为分钟,后5位的二倍为秒数。

  (10)24–25字节 16位二进制的文件最新修正日期,界说同(6)。

  (11)26–27字节 开端簇号的低16位。

  (12)28–31字节 32位的文件字节长度。

  其间第(4)至(8)项为今后接连界说的。 关于子目录项,其(12)为零;已删去目录项的首字节值为E5H。在能够运用长文件名的FAT32体系中,文件目录项保存该文件的短文件名,长文件名用若干个长文件名目录项保存,长文件名目录项倒序排在文件短目录项前面,悉数是选用双字节内码保存的,每一项最多保存十三个字符内码,首字节指明是长文件名的第几项,11字节一般为0FH,12字节指明类型,13字节为校验和,26–27字节为零。

  (七)曾经版别的 Windows 和DOS与 FAT32 不兼容,不能辨认FAT32分区,有些程序也依赖于FAT16文件体系,不能和 FAT32 驱动器一道作业。将硬盘转化为 FAT32,就不能再用双引导运转曾经版别的Windows(Windows 95 [Version 4.00.950]、Windows NT 3.x、Windows NT 4.0 和 Windows 3.x)。

  磁盘结构总述

  1.硬盘结构

  硬盘的内部是由圆形金属片堆叠起来的,每个盘片的双面都有一个磁头(Head)担任读写这个磁面(Side),在每个磁面上区分了一圈一圈的同心圆,叫做柱面(Cylinder)关于软盘一般称之为磁道,在每个柱面中又区分了若干段,称之为扇区(Sector)。因为技能的开展,硬盘的密度越来越大,使得硬盘的实践盘片数越来越少,对磁盘操作的柱面、磁头、扇区被硬盘控制器内部转化,现已不是实践的柱面、磁头、扇区了。因为最早时磁盘存取体系估计不足,传输数据时只给扇区留了6位,柱面留了10位,磁头留了8位。也便是说,柱面最大只能为1023。可是大硬盘的柱面远大于这个数,所今后来就选用将柱面数削减,将磁头数添加的方法来满意磁盘寻址的要求,关于实践地址的转化在BIOS中进行,这叫逻辑块寻址方法(Logical Block Addressing,LBA)硬盘中有关柱面、磁头、扇区的数据都是以此为基准的。

  2.分区结构

  许多的文件数据寄存在磁盘上,需求有安排,这就形成了文件体系。可是各个操作体系的文件体系都不尽相同,为了区分办理文件体系,在现在的PC机上都选用通用的分区结构。分区组织是这样的:硬盘的以一个扇区(便是0柱面0磁头1扇区)叫主引导扇区(Main Boot Record,MBR),寄存着引导程序和主分区表(Main Partition Table)和完毕标志“55AA”。一般称的分区表便是主分区表。一个分区表最多可包括四个分区表项,每个分区表项中标明着一个分区信息或一个扩展分区表的方位,而扩展分区表中或许还有扩展分区表,这就形成了一个链状结构,能够记载许多个分区。 C言语界说如下

  typedef struct

  {

  char bootcode[0x1be]; //发动代码

  PartitionTable PT[4]; //分区表

  word EndingFlag; //完毕标识

  }MBR;

  分区表项的如下:

  typedef struct

  {

  byte BootFlag; //发动标志

  CHS StartCHS; //分区开端的柱面、磁头、扇区

  byte SystemID; //分区类型

  CHS EndCHS; //分区完毕的柱面、磁头、扇区

  dword RelativeSectors; //分区相对扇区数,指分区相关于记载该分区的分区表的扇区方位之差

  dword TotalSectors;//分区总扇区数

  }PartitionTable;

  其间CHS为一个柱面、磁头、扇区的结构,界说如下:

  struct CHS

  {

  byte Head; //磁头

  byte Sector:6; //扇区

  byte CyH2:2; //柱面的高两位

  byte CyL8; //柱面的低八位

  };

  word Cylinder()

  {

  return (word(CyH2)*256+CyL8);

  } //回来柱面值

  void SetCylinder(word Cylinder) //设置柱面值

  {

  CyH2=(Cylinder>>8)&0x3;

  CyL8=(Cylinder&0xff);

  }

  };

  其间分区类型是对应于各种文件体体系一编列的一个代码。比方06H是大于32M的FAT16分区的标志,05H是扩展分区的标志,等等。一般的,关于DOS/Windows3.x/Windows95/98的体系来说,榜首个分区表项记载着DOS主分区(C盘)的信息,并且是能够发动的,第二个分区表项一般是扩展分区,在这个扩展分区表项所指向的分区表中又是一个Dos主分区(D盘)和一个扩展分区,顺次类推。而在绝大部分体系中Dos主分区(C盘)是从0柱面1磁头1扇区开端的。(有些机器在这个方位有个小分区,专门用来办理发动或机器设置,之后才是C盘的分区)

  3.FAT文件体系

  FAT文件体系(FAT12/FAT16/FAT32)是从DOS开展过来的一种文件体系,其长处是简略易用,并被多种操作体系支撑。(现在支撑FAT32的操作体系还不多)FAT文件体系称号后的数字是标识文件中体系一个分配单元所需的位(bit)数。一个FAT12/16文件体系的结构是这样的:引导扇区 榜首文件分配表 第二文件分配表 根目录 数据区

  (1).引导扇区

  引导扇区是文件体系的榜首个扇区,其间包括分区重要的数据信息——BPB(BIOS Paramenter Block-磁盘参数表)。磁盘参数表中包括分区总巨细、磁盘参数等重要信息。其C言语界说为:

  typedef struct

  {

  word SectorBytes; //每扇区字节数

  byte SectorsPerCluster; //每簇扇区数

  word ReservedSectors; //保存扇区数

  byte NbrFat; //FAT的个数

  word RootEntry; //根目录项数

  word TotalSectors; //分区总扇区数(分区小于32M时)

  byte Media; //分区介质标识

  word SectorsPerFAT; //每个FAT占的扇区数

  word SectorsPerTrack; //每道扇区数

  word Heads; //磁头数

  dword HiddenSectors; //隐含扇区数

  dword BigTotalSectors; //分区总扇区数(分区大于32M时)

  }BPB_FAT16;

  其间保存扇区数为从分区开端到榜首个FAT表开端中心的扇区数。隐含扇区数同分区表中的隐含扇区数意义相同。尽管存在FAT个数的界说,但现在的FAT12/16体系基本上没有除2以外的值。因而一般不考虑其他状况。根目录项数是指根目录一共能包容下的目录的项数。一个目录项占32个字节,所以一个扇区有512/32=16个目录项。用这个值除以16便是根目录所占的扇区数。分区总扇区数在分区大于32M时现已超越65535,两个字节现已无法表明,因而在大于32M的分区中TotalSector总是等于零,而将实践的数放在BigTotalSectors中。分区介质标识是确认BPB有用的标志。它有必要与FAT表中榜首个字节的分区介质标识一致。硬盘的分区介质标识为0F8h,假如这个标识不对或许与FAT不一致则将会出“Invalid media type”的过错。

  SectorsPerFAT是每个FAT所占的扇区数。体系依据分区开端地址+保存扇区数+每个FAT所占扇区数*FAT个数+根目录项数/16来确认数据区开端的方位,然后由这个方位+簇号*每簇扇区数来终究确认数据在硬盘扇的详细方位。

  (2)文件分配表

  文件分配表是文件在磁盘上散布的信息。FAT文件体系将数据区按每簇扇区数为单位区分红一个一个单元,每个单元是文件分配的最小单位。这个单元就称为簇。一些大的文件或许占用了许多簇,并且在磁盘上没有接连寄存。FAT表便是为了确认文件每个簇的衔接联系而设的。FAT表的每一项都对应着数据区的一个簇,FAT16的FAT表每一项占16位,也便是两个字节。每一项的内容表明其对应簇的分配状况,0表明没有分配;FFF0h~FFF6h为备用;FFF7h表明坏簇,即该簇中磁盘有损坏;FFF8h~FFFF表明文件完毕;其他值则表明当时簇的下一簇的簇号。FAT表的最前面两项是不必的,因而榜首个数据簇的簇号为2。FAT表榜首个字节也是分区介质类型,和BPB中的相同。因而用“F8 FF FF”能够作为硬盘FAT开端的标志。绝大多数FAT体系有两个FAT表,第二个FAT表又称为后备文件分配表。体系内部完结后备文件分配表与榜首文件分配表的一致。本文评论的彻底康复是根据后备文件分配表没有被损坏的状况下的康复,假如两个文件分配表都被损坏,理论上就无法彻底确认文件信息,因而无法彻底康复。

  (3)根目录

  FAT12/16的根目录是独自列出来的,在后备文件分配表和数据区之间。每个目录项为32个字节,记载一个文件或目录的信息。(长文件名破例)文件修正的原理便是由目录项中指示的开端簇号和数据区开端方位来确认文件的方位,然后康复小的文件。

  4.FAT32文件体系

  FAT32文件体系与FAT12/16的不同较大,一个首要的不同便是将根目录划归到数据区中了,在BPB中专门加了一项根目录开端簇号。这样根目录的巨细就不再受到约束,大大添加了根目录的自由度。

  FAT32的BPB界说如下:

  typedef struct

  {

  word BytesPerSector; //每扇区字节数

  byte SectorsPerCluster; //每簇扇区数

  word ReservedSectors; //保存扇区数

  byte NumberOfFATs; //FAT的个数

  word RootEntries; //根目录项数(FAT32不必)

  word TotalSectors; //分区总扇区数(FAT32不必)

  byte MediaDescriptor; //分区介质标识

  word SectorsPerFAT; //每个FAT占的扇区数(FAT32不必)

  word SectorsPerTrack; //每道扇区数

  word Heads; //磁头数

  dword HiddenSectors; //隐含扇区数

  dword BigTotalSectors; //分区总扇区数

  dword BigSectorsPerFat; //每个FAT占的扇区数

  word ExtFlags; //扩展标志

  word FS_Version; //文件体系版别

  dword RootDirStartClus; //根目录开端簇号

  word FSInfoSec; //指向包括BIGFATBOOTFSINFO结构的扇区

  word BkUpBootSec; //后备引导区的方位

  byte Reserved[12]; //备用

  }BPB_FAT32;

  从上能够看出,FAT32的BPB是在FAT16BPB的基础上加入了一些参数,并停用了一些参数。每个FAT所占扇区数变为4个字节,根目录项数不再运用。FAT32与FAT12/16的另一不同点在于,FAT32既能够一起运用多个FAT表,也能够只运用其间的某一个FAT表。ExtFlags正是这个标志。当ExtFlags的第8位为0时表明一起运用每个FAT表,当其为1时表明只运用其间的一个FAT表,这个FAT表的序号由ExtFlags的低4位给出。FS_Version文件体系版别现在都为0。FAT32将根目录也视作一个目录文件,运用一个簇链(Cluster Chain),RootDirStartClus正是这个链的开端簇号。FAT32有个专门放BIGFATBOOTFSINFO结构的扇区,该结构包括了剩下簇个数,下一个闲暇簇号等信息。这个扇区一般紧接着引导扇区。因为与康复联系不大,本文不做评论。FAT32将引导扇区和文件体系信息扇区信息存了两份,另一份的方位由BkUpBootSec指出。这样因为偶尔产生的损坏就很简单康复。

  5.扩展BIOS参数块

  在BPB的后边是Extended BIOS Paramenter Block。EBPB的结构如下:

  typedef struct //Extended BIOS Paramenter Block

  {

  byte PhysicalDriveNumber; //物理硬盘号

  byte CurrentHead; //当时磁头

  byte ExtBootRecSign; //扩展引导记载标志

  dword SerialNumber; //序列号

  char VolumeLabel[11]; //卷标

  char FSID[8]; //文件体系标识

  }EBPB;

  其间物理硬盘号和当时磁头是体系运转时运用的,硬盘上的值没有什么实践意义。ExtBootRecSign一般为28h或29h。SerialNumber是格局化后生成的序列号。文件体系标识指示了文件体系的类型,即“FAT12”、 “FAT16”、 “FAT32”

  Mass Storage 协议 Bulk-Only 传输协议可参阅USBMASSBULK.PDF文档

  SCSI 指令集可参阅USBMASSUFI.PDF文档

  FAT16文件体系可参阅FAT_PAPER.PDF文档

  相关文档可到WWW.USB.ORG官方网站下载

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/118018.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部