本文首发自 http://testssd.com/?/article/33 欢迎大家支持
Bushound是一款使用起来非常方便快捷的总线数据抓取工具,在我们的测试过成当中,经常会使用它来抓取数据及传输状态用于分析。在这里以usb数据传输为例,大概介绍一下Bushound的使用方法,以及一些典型异常情况的分析。
一、BusHound界面介绍
打开BusHound之后,显示的是这样的界面。当前所显示的界面为顶端界面选项当中的Capture窗口,这个窗口用于显示所有抓取到的数据。点击Stop时会停止数据抓取,这时点击Run,会清空当前数据并开始抓取数据。
这些是想要显示的内容,这些内容可以在Settings窗口下面的Columns to Display设置
选项当中有对应显示内容的解释,在这里就不一个个细说了。
在数据抓取时,不管有没有勾选相应内容,Bushound都会抓取所有Columns to Display当中选项的数据,只是不显示出来而已。如果在抓取完之后想要看相关数据的话,只需要将对应的选项勾选上即可。
在Settings当中可以设置需要显示的内容。
这些选项内容如果在抓取数据的时候没有勾选,那么Bushound是不会抓取的。
在Limits栏中可以设置预留给Bushond抓取数据的缓存空间
Capture Capacity表示缓存的总数据量,Max Record Length表示抓取一个数据包时缓存的数据的量(一条命令\一个状态\一次数据传输,都算一个数据包)。这个在需要的时候可以尽可能设置的大一些,这样抓取的数据比较全面,当数据缓存满了之后,若没有勾选下面的自动停止,则会清除掉所有数据,自动重新开始抓取。
在这个栏目里可以选择什么时候需要自动停止bushound的数据抓取。
Save窗口就是常见的数据保存
Device窗口,用于选择需要抓取的设备及协议层。当勾选到对应的设备那一项时,显示的是经过解析的SCSI协议,设备再上一层是原始的SCSI协议数据。
二、基本协议解析介绍
抓取最简单的的命令时,只需要像上图一样勾选相应设备前面的选项即可,这时抓到的数据主要由 CMD OUT IN组成
(这里我将Max Record length设为16)
CMD表示发送的命令,IN 和 OUT表示数据的读取和发送,关于CMD的含义,这里给出一个列表
这分列表从参考文档SCSI_Commands_Reference_Manual截取出来的,详细相关命令信息也可以从里面查找。
当在Device窗口中勾选了设备的上一层选项时,这时抓到的是SCSI的原始数据
可以看到数据明显多了很多,而且眼花缭乱..
我们一点点来解析一下
首先看第一行
这个就是2Ah写命令的原型,Byte[0:3]为小端数据 0x43425355,这个标志在叫做CBW,表示一次命令传输的开始,由Host下发。
Byte[4:7]为CBW Tag,用于给这一个数据包做一个标识。
Byte[8:11]表示命令之后将要传输的数据长度,这里为0x1000即时4096Bytes。
Byte[12]当中的Bit[7]用于表示传输方向,1为读取,0为发送(其他的暂时还没去看)。
Byte[13]表示操作的设备的Lun号,一个设备可以被分为多个分区,即多个Lun,这里用于表示命令是发送给设备的哪一个Lun的。
从Byte[15]开始,就是之前解析过后的CMD数据了,这里大概说一下重要位置的含义,从这里开始数据为大端数据
Byte[0] OpCode
Byte[1] SubOpCode
Byte[2:5] Address 以Sector为单位
Byte[7:8] Length 以Sector为单位
需要注意的是,除了OpCode以外,其他位置的含义并不是固定的,只是在进行2Ah和28h数据传输过程中,这是比较典型的含义。
所以现在重新看下这一行命令,其用途就是,一条2A的写命令,地址为0x000057A0,长度为8 Sector
下一条就是这个2Ah写命令的数据传输,下发了4096 Bytes数据
我这里为了看起来方便,将抓取长度设成32bytes
再下一条
这是一个由Device发送给Host的数据,开头标识为0x53425355,叫做CSW,用于标志一条SCSI命令传输结束,Byte[4:7]为对应的CBW的Tag。
到此为止,一条SCSI命令就算分析完了,后面的依此类推即可。
后面抽时间再介绍异常状态分析吧
三、SCSI命令发送
打开Devices窗口,双击要发送命令的设备
这时会弹出发送命令控制窗
我一般不用USB来发送命令,点击标签栏的SCSI / ATAPI
这里就可以按照自己想要发送的格式来发送命令,也可以发送自己定制的命令。
这里填写要发送的命令的相关信息,就是Opcode,SubOpCode那些,这里的话填的是一个28h读命令,地址为0x00000020,长度为0x20 Sector。
上面的填好之后,要在DataLength那里填写要进行传输的数据量,0x20 Sector即为16384 Bytes,所以填写16384,因为是读数据,所以方向选择Data In
Timeout表示当超过该设定时间,命令还没有完成的话,则视为超时。从这里可以看出SCSI协议实际上并没有规定超时时间,而是人为设定的。
都填好了之后点击run,就会发送出命令了,左下角会显示出发送的命令的状态。