一.U盘的逻辑结构
U盘可以看作以扇区(1扇区 = 512Bytes)为单位线性排列的实体,即0号扇区,1号扇区,2号扇区……U盘也是Flash,对Flash的操作总是以块为单位,因此对U盘的操作是以扇区为单位,整个扇区地读取或整个扇区地写入.
二 .USB描述符
对各种USB外设按功能划分大类(class),大类下又再细分小类(subclass),每个类别给予一串特定的符号(Descriptor)供主机辨识。
每个USB设备只能有一个DEVICE描述符,它指明了该设备属于哪一个大类,是海量存储器,还是人机交互设备,或者打印机扫描仪之类.
每个DEVICE下可以有一个或多个配置描述符(configuration),以说明该设备含有哪些功能,有几个功能就有几个配置描述符configuration。
每种配置对应若干个接口描述符(Interface),以描述该配置使用哪些接口与主机进行通信.
每个Interface又都是端点(Endpoint)的集合,端点就是设备与主机交换数据的最原子单位,每个Interface用到的端点可以是一个或多个.
三.USB枚举过程
<1>集线器检测新设备
主机集线器监视着每个端口的信号电压,有新设备接入时即可察觉.(集线器端口的两根信号线的每一根都有15千欧的下拉电阻,而每一个设备在D+都有一个1.5千欧的上拉电阻,当用USB线将设备和主机接通后,设备的上拉电阻使信号线的电位升高,因此被主机的集线器检测到).
<2>主机集线器检测到设备之后用中断传输来报告主机,主机收到该中断后会给集线器发送一个GetStatus请求以了解更多的消息。返回的消息告诉主机更多内容。
<3>集线器重新设置这个新设备
当主机知道有一个新的设备时,主机给集线器发送一个Set_Feature请求,请求集线器来重新设置端口,集线器使得设备的USB数据线处于重启(RESET)状态至少10ms.
<4>主机发送一个Get_Status请求来验证设备是否激起重启状态。返回的数据有一位表示设备仍处于重启状态,当集线器释放了重启状态设备就处于默认状态了,即设备已经准备好通过Endpoint 0的默认流程响应控制传输。即设备现在使用默认地址0x0与主机通信.
<5>集线器检测设备速度
集线器通过测定那根信号线(D+或D-)在空闲时有更高的电压来检测设备是低速还是高/全速设备(高/全速设备D+有上拉电阻,低速设备D-有上拉电阻)。
<6>获取最大数据包长度
主机向address 0 发送USB协议规定的Get_Device_Descriptor命令,以取得缺省控制管道所支持的最大数据包长度,并在有限的时间内等待USB设备的响应,该长度包含在设备描述符的bMaxPacketSize0字段中,其地址偏移量为7,所以这时主机只需读取该描述符的前8个字节。注意,主机一次只能列举一个USB设备,所以同一时刻只能有一个USB设备使用缺省地址0.
<7>主机分配一个新的地址给设备
主机通过发送一个Set_Address请求来分配一个唯一的地址给设备。设备读取这个请求,返回一个确认,并保存新的地址,从此开始所有通信都使用这个新地址.
<8>主机向新地址重新发送Get_Device_Descriptor,此次读取其设备描述符的全部字段,以了解该设备的总体信息,如VID,PID。
<9>主机向设备循环发送Get_Device_Configuration命令,要求USB设备回答,以读取全部配置信息。
<10>主机发送Get_Device_String命令,获得字符集描述(unicode),比如厂商,产品描述等等.
<11>根据Device_Descriptor和Device_Configuration应答,主机判断是否可以提供驱动.
<12>加载了USB设备驱动以后,主机发送Set_Configuration(x)命令请求为该设备选择一个合适的配置(x代表非0的配置值)。如果配置成功,USB设备进入”配置”状态,并可以和客户软件进行数据传输。
至此设备开始可以使用.
四.USB协议
4.1 数据格式
USB是一种主从的结构,所有传输由HOST发起.主机发起一次传输的时候,这次传输的包(Packets)中通常包括三个阶段.主机
首先是发送一个令牌包(Token Packet),可分为输入包(用于设置输入命令)、输出包(设置输出命令)、设置包和帧起始包,其中包含本次传输的命令类型(type),方向(direction),设备的地址(device address)以及端点号(Endpoint).输入包、输出包和设置包格式一样如下:
帧起始包格式:
SYNC+PID+11位FRAM+CRC5+EOP
紧接着是数据包(data packet),就是包含数据了.分为DATA0 包和DATA1包,当USB发送数据的时候,一次发送的数据长度大于相应端点的容量时,就需要把数据包分为几个包,分批发送,DATA0和DATA1包交替发送。但是在同步传输中所有的数据包都是DATA0,格式如下:
最后将由device返回握手信号包(handshake packet),表示是正确收到了(ACK),还是其他的失败原因.格式:
同步域(SYNC):8位,值固定为0000 0001,用于本地时钟与输入同步。
标识域(PID):由四位标识符和四位标识符的反码构成,表明包的类型和格式
地址域(ADDR):七位地址,代表了设备在主机上的地址,地址0000 0000 被命为零地址,是任何一个设备第一次连接到主机时,在被主机配置、枚举前的默认地址
端点域(ENDP):四位
帧号域(FRAM):11位,每一个帧都有一个特定的帧号,帧号域最大容量0x800,对于同步传输有重要意义。
数据域(DATA):长度为0~1023个字节,在不同的传输类型中,数据域的长度各不相同,但必须为整数个字节的长度.
校验域(CRC):对令牌包和数据包中非PID域进行校验的一种方法。
包结尾域(EOP):发送方在包的结尾发出包结尾信号,主机根据EOP判断数据包的结束.
USB的传输模型:HOST和设备的某个端点之间可以看成有一条逻辑管道(pipe).Pipe分两种:业务数据流和信令消息.业务流即指纯粹的数据,信令流指控制信息。在信令管道中,有一条默认的管道,就是零地址的零号端点,这条管道在USB设备上电复位或者总线复位后就存在了,便于HOST利用这个地址向USB设备进行配置。
USB的传输类型有四种:
控制传输(control transfer):通常只用于在设备复位后HOST通过端点0进行配置.
块传输(Bulk transfer):譬如U盘的大量数据传输即用此方式。
中断传输(Interrupt transfer):一般用于人机设备如USB鼠标键盘等.
等时传输(Isochronous transfer):可以进行带宽控制的实时传输形式.
4.2 事务
在USB上数据信息的一次接收或发送的处理过程称为事务处理(Transaction).事务处理的类型包括输入(IN),输出(OUT),设置(SETUP)和帧开始,帧结束等类型.在输出(OUT)和设置(SETUP)事务处理中,紧接着SETUP和OUT包后的是DATA包,DATA0和DATA1交互发送。在DATA包之后设备将回应一个握手信号,如果设备可以接收数据回应ACK包,如果设备忙回应NAK,出错回应STALL。
输入(IN)事务处理:表示主机从USB设备接收一个数据包的过程
输出(OUT)事务处理:
设置(SETUP)事务处理:
五.FAT16文件系统简介
文件系统的作用是对文件在介质上的存储进行管理,并为操作系统提供操作函数
大多数情况下的FAT16格式U盘结构如上图所示,如果U盘带有boot功能,则在保留区前还将有MBR和若干个隐含扇区。
引导扇区(DBR):存储本分区的BPB信息.
FAT1是文件分配表主表(FAT=File Allocation Table),记录数据区中每个簇的使用情况,其大小根据U盘的实际大小而定。
FAT2是FAT1的备份,大小与主表一致.
根文件夹存储文件名目录名等目录信息,固定占据32个扇区大小.
剩下的数据区就是真正存储数据文件内容的区域.
在操作一个U盘的文件系统前必须先获取其文件系统信息,可以根据引导扇区计算出FAT1\FAT2、根文件夹以及数据区等的起始地址(对扇区的访问依照其绝对扇区号寻址,绝对扇区号=逻辑扇区号+隐含扇区号,逻辑扇区号是指不计算MBR等隐含扇区的号,DBR的逻辑扇区号总是0,即总是逻辑分区的第一个扇区.)
保留区:若U盘被格式化成boot分区,保留区前含有MBR和若干个隐含扇区。MBR是主引导记录的缩写(Master Boot Record),是物理上第一个扇区(如果它存在的话),因而绝对扇区是0,它就独立于任何一个分区(或者称“卷”)。MBR的前446字节是系统引导程序,接着的64个字节就是分区表DPT(Disk Partition Table),最后两字节是扇区有效标志55 AA.
DPT以每分区16个字节的大小存放着最多四个主分区的信息。对于U盘来说因为一般只有一个分区,所以其分区信息就存在DPT的第一个16字节中,最重要的是偏移地址为0x1C6 处的信息,它指示着引导记录DBR相对于MBR的偏移地址.上图中该值是0000003F(双字节存放),0x3F=63,即DBR的绝对扇区号是(0) + 63 = 63(意即DBR前面有63个隐含扇区).
鉴于MBR有的情况下存在有的情况下不存在,在初始化U盘时可以判断扇区号0的内容,然后判断偏移地址54,55和82,83处的ASCII值,如果是DBR,偏移位置54和偏移位置82的内容都会是”FAT”这个字符串,而MBR则不会出现这个字符串.
DBR扇区(DOS Boot Record)总是位于逻辑分区的第0扇区(逻辑分区第一个),DBR从第一个字节开始就依序存储了重要的分区信息,称为BPB(Bios Parameter Block)
其中红色部分是计算FAT1起始地址,根目录起始地址、数据区起始地址的重要参数.
文件分配表 =保留扇区数
根目录 = 文件分配表起始号+FAT的个数 x 每个FAT的扇区数
数据区 = 根目录逻辑扇区号 + 32
FAT区:该区包含主表和备份表,两者的内容是完全一致的。FAT表的作用是记录数据区中每个簇的使用情况以及维护簇链的链式关系,是FAT文件系统的核心. 簇是文件系统固定若干个连续的扇区定义为一簇
文件系统中为了存储每个文件,最小分配单位是簇(以扇区为单位会增加fat表的项数,对大文件存取增加消耗),也就是说即使一个只有几字节大小的文件也是分配一个簇的空间来存放。
FAT16系统下的FAT表以16bit宽度的数值记录每个簇的使用情况,即数据区中的每一簇在FAT表中占据2个字节以存放信息,所以FAT16最大可以表示的簇号为0xFFFF,以32k为簇的大小的话,FAT16可以管理的最大磁盘空间为32k x 65535 = 2048MB,所以FAT16支持最大2GB分区。
FAT表实际上是一个数据表,以2个字节为单位,可以称作FAT记录项,通常情况下其第1,2个记录项(前4字节)用作介质描述,从第3个记录项开始记录除数据区文件存储的簇链情况,每簇的使用情况用32位二进制填写,未被分配的簇相应位置写零;坏簇相应位置填入特定值;已分配的簇相应位置填入非零值,具体为:如果该簇是文件的最后一簇,填入的值为FFFFFF0FH,如果该簇不是文件的最后一簇,填入的值为该文件占用的下一个簇的簇号,这样,正好将文件占用的各簇构成一个簇链,保存在FAT表中。0000000H、00000001H两簇号不使用,其对应的两个DWORD位置(FAT表开头的8个字节)用来存放该盘介质类型编号。FAT表的大小就由该逻辑盘数据区共有多少簇所决定,取整数个扇区。
如上图:FAT表以F8 FF FF FF开头,此2字节为介质描述单元,不参与FAT表簇链关系,小红字标出的是FAT扇区每2字节对应的簇号。相对偏移0x4~0x5偏移为第2簇(顺序上第1簇),此处为FF表示存储在第2簇上的文件(目录)是个小文件,只占用一个簇就结束了。第3簇中(偏移0x6,0x7)存放的数据是0x0005,这是一个文件的首簇。其内容为5,是指接下来的内容位于第5簇,查看第5簇(偏移0xA,0xB)内容为0xFF,0xFF,表示此文件已至尾簇。第4簇(偏移0x8,0x9)存放的数据是0x0006,这又是一个文件的首簇,其内容为6,表示接下来的簇位于第6簇,然后依次第7簇->第8簇->……->第14簇,其内容为0xFF,0xFF,至此该文件尾簇.后面与此类同.
根文件夹,也称文件目录表FDT(File Directory Table),主要存放文件和目录的信息,文件名,创建时间,文件大小等信息即存放于此。文件目录分为两类:根目录和子目录。FAT16的根文件夹固定占有32个扇区的空间,它使用32字节存储每笔记录项,因此FAT16系统中最多只能处理32x512/32 = 512个目录项。
32字节的目录项数据结构定义如下:
全部32字节的定义如下:
⑴ 0-- 7字节 文件正名。
⑵ 8--10字节 文件扩展名。
⑶ 11字节文件属性,按二进制位定义,最高两位保留未用,0至5位分别是只读位、隐藏位、系统位、卷标位、子目录位、归档位。
⑷ 11--13字节 仅长文件名目录项用,用来存储其对应的短文件名目录项的文件名字节校验和等。
⑸ 13--15字节 24位二进制的文件建立时间,其中的高5位为小时,次6位为分钟。
⑹ 16--17字节 16位二进制的文件建立日期,其中的高7位为相对于1980年的年份值,次4位为月份,后5位为月内日期。
⑺ 18--19字节 16位二进制的文件最新访问日期,定义同⑹。
⑻ 20--21字节 起始簇号的高16位。
⑼ 22--23字节 16位二进制的文件最新修改时间,其中的高5位为小时,次6位为分钟,后5位的二倍为秒数。
⑽24--25字节 16位二进制的文件最新修改日期,定义同⑹。
⑾26--27字节 起始簇号的低16位。
⑿28--31字节 32位的文件字节长度。
六,FAT32与FAT16的主要区别
(1)保留扇区数,FAT16只有引导扇区即DBR,而FAT32除了引导扇区外还有31个保留扇区,主要是留给操作系统进行DBR的备份以及存放其它配置.
(2)FAT表项从16bit增加到32bit,即数据区的每簇占据FAT表4个字节
(3)取消了根文件夹区,把文件目录项信息放入数据区,等同普通文件一样.
DBR(DOS Boot Record)引导记录区,其中重要的是BPB(Bios 参数快),定义如下:
序号 | 偏移地址 | 意义 |
1 | 03H~05H | OEM号 |
2 | 0BH~0CH | 每扇区字节数 |
3 | 0DH | 每簇扇区数 |
4 | 0EH~0FH | 保留扇区数 |
5 | 10H | FAT备份数 |
6 | 11H~12H | 根目录项数 |
7 | 13H~14H | 磁盘总扇区数 |
8 | 15H | 描述介质 |
9 | 16H~17H | 每FAT扇区数 |
10 | 18H~19H | 每磁道扇区数 |
11 | 1AH~1BH | 磁头数 |
12 | 1CH~1FH | 特殊隐含磁扇区 |
13 | 20H~23H | 总扇区数 |
14 | 24H~25H | 物理驱动器数 |
15 | 26H | 扩展引导签证 |
16 | 27H~2AH | 卷系列号 |
17 | 2BH~35H | 卷标号 |
18 | 36H~3DH | 文件系统号 |
参考:http://wenku.baidu.com/view/2f7f18e2e009581b6bd9eb44
http://wenku.baidu.com/view/3c94d6edb8f67c1cfad6b880
FAT32 Spec from Microsoft FAT32 Spec from Microsoft
转:http://blog.sina.com.cn/s/blog_4c02ba150101nhaj.html