SCSI的英文全称是Small Computer System Interface, 翻译过来就是“小型计算机系统接口”,是一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准。 SCSI是一种智能的通用接口标准。
这篇文章重点讲述计算机与硬盘之间的交互, 以小编的电脑为例,
电脑上配备了一块BIWIN SATA SSD + 一块机械硬盘, 查看这两块硬盘的接口标准皆为SCSI.
除了SCSI,IDE(英文全称为“Integrated Drive Electronics”,即“电子集成驱动器”)也是一种极为常用的接口。这里不多讲IDE,主要说一下IDE与SCSI的区别:
- IDE的工作方式需要CPU的全程参与,CPU读写数据的时候不能再进行其他操作,这种情况在Windows多任务操作系统中,自然就会导致系统反应的大大减慢。
- 由于SCSI卡本身带有CPU,可处理一切SCSI设备的事务,在工作时主机CPU只要向SCSI卡发出工作指令,SCSI卡就会自己进行工作,工作结束后返回工作结果给CPU,在整个过程中,CPU均可以进行自身工作,完全通过独立的高速的SCSI卡来控制数据的读写操作,CPU就不必浪费时间进行等待,显然可以提高系统的整体性能。
SCSI/ATA command的下发方式
目前可以供用来下发SCSI/ATA Command的工具有很多,比如BusHound, Hdparm, Sg3, Msecli等。其中Msecli是Micron自己的专门用来管理Micron SSD的命令行接口, 对于其他家的SSD是无效的。我们这里主要用的Sg3这个工具,
愣~~~,sg3是啥?
不急,来,先看看sg3官网咋说的:
''The sg3_utils package contains utilities that send SCSI commands to devices.As well as devices on transports traditionally associated with SCSI (e.g. Fibre Channel (FCP), Serial Attached SCSI (SAS) and the SCSI Parallel Interface(SPI)) many other devices use SCSI command sets. ATAPI cd/dvd drives andSATA disks that connect via a translation layer or a bridge device are examples of devices that use SCSI command sets.
''
按照sg3官网的说法, sg3可以对SATA盘通过两种方式直接下发SCSI Command:
- 直接用电脑SATA接口;
- 用SATA转USB接口也可以;
不管黑猫白猫,能逮住老鼠就是好猫! 找到了可以为我们所用的工具,我们就开工,
打开sg3工具包你会发现好多.exe执行档啊~用哪个啊~啊~啊~抓狂~~~
其实sg3已经定义了大部分的SCSI command,只要按照说明直接执行就可以。可惜的是,小编本次在处理case时需要用的SCSI command并没有集成,所以在后续的过程中小编只用到两个执行档, sg_scan.exe和sg_raw.exe,
对这两个执行档,sg3官网的解释是:
sg_scan.exe:shows one device per line, with the device's various names and INQUIRY response string on that line. 简单的说就去扫一下系统当下几块硬盘。
看到上图扫描的结果是发现三块盘,对的,没错,鉴于前面提到的一块BIWIN SATA SSD + 一块机械硬盘里面存有重要资料,为了保险起见,就不用来做实验了,小编另外用SATA转USB转板接了一块Tigo SSD, 哈哈,对,这块盘将用来做后续的实验,
sg_raw.exe:send user supplied cdb. 意思就是说要用户自己定义SCSI command的CDB。
那么,问题来了,CDB又是什么东东?
没关系,SCSI Spec是这样说的:
CDB用中文可以很直白的翻译就是命令描述块,简单的来说就是供用户自己定义下发SCSI command的内容。
按照SPEC里的定义,CDB的长度主要有三类: 6字节,10字节,12字节以及16字节。
后续我们的实例主要采用12字节的方式,具体定义如下:
上面12-byte command定义里面最关键的是找到OPERATION CODE,因为我们是采用自定义的方式下发SCSI command,所以,我们这里采用的ATA PASS-THROUGH(12字节),其对应的OPERATION CODE是A1h,
SCSI spec对ATA PASS-THROUGH(12字节)的定义如下:
上图里面protocol的具体定义分类:
好了,到这里我们应该就知道大概怎么下发SCSI command了,古人有云“纸上得来终觉浅,绝知此事要躬行”。我们下面还是结合具体的SCSI/ATA command来检验一下我们的认知。
比如,我们要在Windows环境下发standby immediate command,
这个时候,还得先看一下ATA spec对standby immediate command的定义,
从上图里面我们可以得到两个重要信息:
- standby immediate command的代码是0xE0,
- standby immediate command的protocol是Non-Data,
结合前面的理论,我们下发standby immediate command的具体12-byte应该是:
A10600 00 00 00 00 00 00E000 00
到这里就是,万事俱备,只欠东风咯~
我们现在用sg3工具包执行一下,看看是否可以成功哈~
从结果来看,成功咯~
希望此文可以带给大家些许的帮助,感兴趣的朋友可以自己玩一下~~~