打印

命令封装包CBW包中的CBW.dDataLength和Write(10)中的传输长度是由什么决定的呢

[复制链接]
3340|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我在做一个USB大容量存储实验时遇到一个问题: 就是命令封装包CBW包中的CBW.dDataLength和Write(10)中的传输长度中的长度大小全是0x10000,不论我往大容量设备中复制多大的文件。我本以为它们应该是我所复制文件的大小,可是为什么在实验中全是0x10000大小的固定值呢,结果导致CBW解析频繁,导致速度减慢,所以我疑问CBW包中的CBW.dDataLengthWrite(10)中的传输长度中的长度大小是由什么决定的呢?是在配置中设定的,还是由上位机决定的??
求大家指点一下,比较急,望各位知道的不吝赐教, 谢谢!!!

相关帖子

沙发
john_lee| | 2013-4-28 01:34 | 只看该作者
截图来看看

使用特权

评论回复
板凳
iqizheng|  楼主 | 2013-4-28 13:25 | 只看该作者
我是通过ULink 2调试程序看到的结果,即命令封装包CBW包中的CBW.dDataLength和Write(10)中的传输长度中的长度大小全是0x10000,这个怎么截图?
我想命令封装包CBW包中的CBW.dDataLength和Write(10)中的传输长度中的长度大小应该是我所要复制的文件的大小,可是如果是0x10000的话,使我无法判断还剩余多少需要传输??
求助! 谢谢了!

使用特权

评论回复
地板
john_lee| | 2013-4-28 14:23 | 只看该作者
用这个软件抓包:

截图,里面可以很清楚地看见CBW包的内容。

使用特权

评论回复
5
iqizheng|  楼主 | 2013-4-28 21:22 | 只看该作者
首先,非常感谢john_lee,看得出来您很热心,我原先也用过Bus hound,现截图如下:望帮忙分析一下.为何命令封装包CBW包中的CBW.dDataLength和Write(10)中的传输长度中的长度大小为恒定值,而不是随我复制文件的大小改变? 再次感谢!

cbw截图2.jpg (177.11 KB )

cbw截图2.jpg

cbw截图.jpg (317.23 KB )

cbw截图.jpg

使用特权

评论回复
6
iqizheng|  楼主 | 2013-4-28 21:43 | 只看该作者
不好意思,刚才截的图有问题,是我复制文件时,Bushound停下来截得,不能反映我所说的问题,下图是我重新截得的图,可以从划红线的地方看出CBW包中的CBW.dDataLength是0x10000,而Write(10)中的传输长度中的长度大小为0x10*块大小(这里块大小为我所设的页大小为4096),故Write(10)中的传输长度是16页,即为0x10000,那么请问这是为什么呢? 由什么决定?我需要使其变大,用来加速,请各位帮忙分析,谢谢!!

cbw更正.jpg (247.56 KB )

cbw更正.jpg

使用特权

评论回复
7
iqizheng|  楼主 | 2013-4-29 15:15 | 只看该作者
我又测试了买的4G金士顿U盘,发现结果是一样的,命令封装包CBW包中的CBW.dDataLength和Write(10)中的传输长度中的长度大小全是0x10000,这是有电脑格式化U盘时的文件系统决定的吗?
求解答!

使用特权

评论回复
8
iqizheng|  楼主 | 2013-4-29 20:29 | 只看该作者
置顶,不要沉,谢谢大家,望指点,这对我的大容量存储提速很关键

使用特权

评论回复
9
lzqxs89| | 2013-4-29 22:58 | 只看该作者
等大神来回答。。。

使用特权

评论回复
10
john_lee| | 2013-4-30 18:05 | 只看该作者
跟下面几个原因有关:
1、本次读写的连续扇区数量。
比如1个文件占用了lba第1,2,3,4,6,7,8扇区(第5扇区被其它占用),那么读写必定会分段操作的。
2、应用程序的缓冲大小。
就是直接操作mass storage的程序,比如windows explorer,它不可能一次把整个文件都读进内存,而是分配了一个缓冲(64K?),一段一段地读写。
3、驱动程序的缓冲大小。
这个是mass storage的内核驱动了,按理它也应该有缓冲来分段读写设备的。

使用特权

评论回复
11
iqizheng|  楼主 | 2013-4-30 22:11 | 只看该作者
我感觉第一种和第二种原因不大,因为我也用买的U盘测试了,即使拷贝的文件是一个整体,命令封装包CBW包中的CBW.dDataLength和Write(10)中的传输长度中的长度大小也不会超过0x10000,所以第一种原因不对。第二种,我是写入到U盘中,和应用程序关系不大。 对于第三中原因,mass storage的内核驱动是指我自己写的主控芯片内的固件程序吗,这是我自己控制的啊,我想知道的问题是命令封装包CBW包中的CBW.dDataLength和Write(10)中的传输长度中的长度大小如何能超过0x10000? 而且我看了你说的比如1个文件占用了lba第1,2,3,4,6,7,8扇区(第5扇区被其它占用),这种情况会发生吗?因为我是这样想的,既然命令封装包CBW包中的CBW.dDataLength和Write(10)中的传输长度中的长度大小一般是0x10000,并不是每次依次递减一个扇区,故我怀疑难道USB协议最小写的大小是0x10000,即每次至少连续写入0x10000大小,才可以换地址再写。@john_lee ,你可以用个U盘测试试试,看看这样分析对不??

使用特权

评论回复
12
iqizheng|  楼主 | 2013-4-30 22:35 | 只看该作者
截个图为证吧,以下是对我所买的4g U盘的一个截图,由图知每次WRITE(10)命令基本上传输长度都是0x10000,也就是说每次在一个给定的起始地址至少要写0x10000大小。故1个文件占用了lba第1,2,3,4,6,7,8扇区(第5扇区被其它占用)的情况不可能发生,如果是这样的话,我通过什么方式知道我要复制的文件传完了呢?

clip_image002.jpg (60.23 KB )

clip_image002.jpg

使用特权

评论回复
13
john_lee| | 2013-5-1 10:18 | 只看该作者
找到原因了,就是我说的第 3 点,windows 系统在 mass storage 的驱动(usbstor.sys)中,为 bot 传输开的缓冲只有 64KB,应用程序发出的任何超过 64KB 的读写,都会被 usbstor 驱动分割成 64KB 的段,分几次完成。
microsoft 提供了一个补丁(Windows6.1-KB2581464-x86),把 64KB 的缓冲提高到了 2MB,但遗憾的是,这个补丁仅限于 windows6.1 以上系统,就是win7 以上了,而 xp 和 vista 则无缘。

使用特权

评论回复
14
john_lee| | 2013-5-1 10:20 | 只看该作者
楼主可以结贴了,:D

使用特权

评论回复
15
iqizheng|  楼主 | 2013-5-1 15:28 | 只看该作者
真的??“windows 系统在 mass storage 的驱动(usbstor.sys)中,为 bot 传输开的缓冲只有 64KB,应用程序发出的任何超过 64KB 的读写,都会被 usbstor 驱动分割成 64KB 的段,分几次完成。
microsoft 提供了一个补丁(Windows6.1-KB2581464-x86),把 64KB 的缓冲提高到了 2MB,但遗憾的是,这个补丁仅限于 windows6.1 以上系统,就是win7 以上了,而 xp 和 vista 则无缘。”

可否给出出处,非常感谢 @john_lee  啊,真的好热心,我会结帖的,,另外你可以如何提高自制U盘的读写速度?看看我的另外一个帖子吗?看看有何高见,不吝赐教啊。

使用特权

评论回复
16
iqizheng|  楼主 | 2013-5-1 15:41 | 只看该作者
我找到网址了打个补丁,USB 2.0提速四成,看来可以结贴了,只是知道原因,却没有很好的提高写速度的解决办法,比较遗憾,

使用特权

评论回复
17
iqizheng|  楼主 | 2013-5-1 15:48 | 只看该作者
,如何结贴啊,为何提示“分数未分配完,或分数分配存在错误”,第一次结贴,囧!

使用特权

评论回复
18
qindehai| | 2013-5-28 15:41 | 只看该作者
本帖最后由 qindehai 于 2013-5-28 15:42 编辑

楼主找到真的原因了吗??我想求证你的一个问题,从数据上来看,你的每个Sector 是4K,而不是普通的U disk 512.我想知道你是怎么回PC 读格式容量(0X23)和读容量命令(SCSI 0X25)的??如果你回复的是每个Sector 是512,那传输长度和Luns 长度是一致的。如你的金士顿U DISK 0x10000=0x80*512

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

25

帖子

0

粉丝