SCSI消息
% h1 w9 W9 \* W# I8 j3 [
在SCSI系统中,消息是控制和管理启动器与目标器之间信息交换的通信规范,说通俗些,消息是指为了控制和管理启动器与目标器之间的信息交换而设置的一系列的联络信息,这些信息采用SCSI总线规范中所规定的编码,表示特定的含义。
2 ?7 v( n& ^; W1 {( m9 {" e6 d
SCSI的消息有单字节、双字节和多字节三种,消息的第一个字节一般来说是消息代码,该代码决定了消息的格式。在表10.9中描述了消息的格式种类。当消息中包含扩展消息时,在第二个字节中将会给出扩展消息的长度,第三个字节中将包括扩展消息代码。表10.10描述了扩展消息的一般结构。
! c4 F7 G C ^- D' h9 A+ h
+ i6 z2 n% J5 R5 |0 Y
- r$ {3 b- t2 L1 g" f6 V6 Y$ }/ E# q* j7 {; f: r) Z
, A5 r! j3 D( T( K' ]& l
# t4 \2 y3 {* e SCSI系统中有近三十种消息,下面是其中的三种。
$ h3 @- G0 P& B9 ]6 ~9 A: N
①命令完成消息:该消息为单字节消息,代码为OOH。目标器使用该消息告知启动器命令已被成功执行。
; W5 A3 p8 B7 T0 y ②同步数据传送请求消息:该消息为5个字节,用来请求对方用同步方式传送数据。第一个字节为扩展消息标志代码(01H),第二个字节为扩展消息字节数(03H),第三个字节是消息的代码(01H),第四个字节是传送周期,是4 ns的倍数,最后一个字节是REQ/ACK偏移量。对方(不管是启动器还是目标器)接收到该消息后,会用同样的消息立即作出应答。这次发送的消息可以是接收到的消息的简单重复,也可以附加上一些小小的请求,例如要求周期长一些,偏移量小一些。如果该设备根本不支持同步数据传送模式,则它可以发送一个“消息拒收”消息或偏移量置0的同步数据传送请求消息。
# E% L% R; k/ q1 p/ O2 E( x, x
③识别消息:识别消息用来在启动器和目标器或目标程序建立联系。启动器在选择阶段结束后传送该消息;目标器在重选择阶段后也传送该消息。该消息为单字节,消息中各位的含义见10.11。
( |1 g9 W8 }; V
- [0 s! Q- U8 W# z" }
+ v& N! v) U) H7 l9 a8 T& ~
5 D2 f8 s0 R5 W. |) [# v
1 t* ]* \$ y+ I6 T
2 G8 Q. N/ x: h2 G" z 识别消息的最高位固定为1。D6位为DiscPriv(Diseonnect privilege),即断路特权。该位只能由启动器设置,取l表示允许目标器具有取消连接和再连接功能。后面6位在SCSI-2和SCSI-3中定义不一样。在SCSI-2中,D5位为LUNTAR,即LUN/目标程序。该位为1表示寻址一个目标程序例程(该程序主要用来对设备诊断和测试);反之,寻址LUN。接着的两位(D4、D3)为保留位。最低3位为LUNTRN,即LUN/目标程序号,用来指定LUN或目标程序号。在SCSI-3中,D5位为保留位。最低5位为LUN,以指定多达32个逻辑单元(子设备)中的一个。
|+ R* \& i4 v) I! I$ t2 L 由于大部分SCSI设备嵌入有控制器且目标器中只有一个逻辑单元,所以识别消息中的LUNTRN字段(或SCSI-3中的LuN字段)通常是0,识别消息通常是COH。如果在命令的执行过程中不允许目标器释放总线,则识别消息的值为80H。
2 j* N9 x$ z1 u& f6 s; Y5 Q 为了进一步理解SCSI的消息机制(SCSI传输协议的重要组成部分),下面举一个综合例子——释放总线和重新选择(如图10.13所示)。
; m$ U0 F) L0 B- [. y
. ]* v: S$ {8 V, N: }. U
; J$ t! O$ |4 @0 i( Q/ n
7 y. ], i+ I( n% S1 C. [
g$ S/ {1 }% I6 s$ {! v
R7 u: H1 u" w& w. d: z
SCSI总线的最重要的特点之一是目标器可以中断正在进行的I/O操作,并释放总线,然后再重新连接。启动器在主机的内存中为每一个I/O进程保留了一块存储区(或叫缓冲区),用来保存I/O进程的SCSI命令、数据和状态信息。为了使被中止的I/O进程在重新连接后能接着做下去,SCSI消息系统中设置了“保存数据指针”消息。目标器使用该消息请求启动器保存当前连接设备的指针。
) [$ ]# P- D7 v6 m0 K, { I/O进程是操作系统中的一个重要概念。这里的I/O进程是指启动器与某个目标器之间进行数据传送或目标器进行某种操作的一段程序(执行过程)。
9 F X2 z+ w, g7 Q! H+ |% c 下面对图10.13中的示例进行说明。
( R0 u4 u; C- M6 ` ①ID编号为7的启动器在设置命令、数据和指针之后使总线进入仲裁阶段,以获取SCSI总线的使用权。它将数据线的D7位置1,并使ATN信号为真。此时总线数据为80H,说明没有其他设备参与竞争,于是它获得总线的使用权。
$ c7 _- L4 k9 c* n/ y, J
②在选择阶段,启动器选择ID为0的设备作为目标器(总线数据为81H),并保持ATN为真。
3 v' z4 `* F g7 S- T ③由于ATN的存在,被选中的目标器使总线进入消息输出阶段。启动器送出识别消息(COH),DiscPriv位为1表示允许目标器具有取消连接和再连接功能。识别消息中的LUN号为0。
$ M; x* z) d! K- d% v
④目标器使总线进入命令阶段,并接收启动器送来的读命令的命令描述块(CDB)。操作码为08H,起始逻辑块号为000000H,传输块数为01H,控制码为00H。然后解释CDB中的内容。
! O# O# w4 G0 v( z. K
⑤由于读盘操作需要寻找盘上的数据块地址,在这段时间里不需要使用总线,因此目标器使总线进入消息输入阶段,发送“保存数据指针”(02H)和“断开连接”(04H)两条消息,然后释放总线。
% k1 K6 t, {! I& K. J9 \* |8 a$ h7 Y
⑥目标器按照命令描述块(CDB)中指定的逻辑块地址计算并寻找盘上的物理地址。利用这段时间启动I/O进程2和I/O进程3,并执行相应的I/0操作。
( ^ D9 \; v3 f. d$ f! N' A
&;