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

[复制链接]
4198|17
 楼主| iqizheng 发表于 2013-4-27 21:29 | 显示全部楼层 |阅读模式
我在做一个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包的内容。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| iqizheng 发表于 2013-4-29 15:15 | 显示全部楼层
我又测试了买的4G金士顿U盘,发现结果是一样的,命令封装包CBW包中的CBW.dDataLength和Write(10)中的传输长度中的长度大小全是0x10000,这是有电脑格式化U盘时的文件系统决定的吗?
求解答!
 楼主| iqizheng 发表于 2013-4-29 20:29 | 显示全部楼层
置顶,不要沉,谢谢大家,望指点,这对我的大容量存储提速很关键
lzqxs89 发表于 2013-4-29 22:58 | 显示全部楼层
等大神来回答。。。
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的内核驱动了,按理它也应该有缓冲来分段读写设备的。
 楼主| 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盘测试试试,看看这样分析对不??
 楼主| iqizheng 发表于 2013-4-30 22:35 | 显示全部楼层
截个图为证吧,以下是对我所买的4g U盘的一个截图,由图知每次WRITE(10)命令基本上传输长度都是0x10000,也就是说每次在一个给定的起始地址至少要写0x10000大小。故1个文件占用了lba第1,2,3,4,6,7,8扇区(第5扇区被其它占用)的情况不可能发生,如果是这样的话,我通过什么方式知道我要复制的文件传完了呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
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 则无缘。
john_lee 发表于 2013-5-1 10:20 | 显示全部楼层
楼主可以结贴了,:D
 楼主| 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盘的读写速度?看看我的另外一个帖子吗?看看有何高见,不吝赐教啊。
 楼主| iqizheng 发表于 2013-5-1 15:41 | 显示全部楼层
我找到网址了打个补丁,USB 2.0提速四成,看来可以结贴了,只是知道原因,却没有很好的提高写速度的解决办法,比较遗憾,
 楼主| iqizheng 发表于 2013-5-1 15:48 | 显示全部楼层
,如何结贴啊,为何提示“分数未分配完,或分数分配存在错误”,第一次结贴,囧!
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

粉丝
快速回复 在线客服 返回列表 返回顶部