li_qingsong
驱动牛犊
驱动牛犊
  • 注册日期2003-07-03
  • 最后登录2004-08-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2696回复:4

至今最完整的SCSI知识总结--抛砖引玉

楼主#
更多 发布于:2003-09-15 15:27
*****************************************************************************
*作者:李青松                                                                *
*MSN:li_qing_song@hotmail。Com                                           *
*                                                                           *
*****************************************************************************
SCSI通讯
注:
TARGET目标
INITIRTOR起始器
release 使信号变为高阻状态.
False 使信号变为高阻状态.
Nagate 使信号变为高阻状态.
assert 使信号有效.
true使信号有效.

1. 专有名词:
1) 断开连接:使SCSI总线变为自由阶段。
2) 域:一组邻近的位。
3) 主机适配器:作为一个起始器使用。
4) I/O处理:一个I/O处理是以建立一个连接关系作为起始,以COMMAND COMPLETE或者RELEASE RECOVERY等消息的成功传输作为终结的。
5) I_T 连接:起始器和目标之间的连接。
6) I_T_L连接:起始器和目标以及逻辑单元之间的连接。
7) 逻辑块:起始器提供的数据的单位。
8) 逻辑单位:一个物理或者虚拟的外部设备。
9) 页:一些命令使用固定的参数结构,他们就被指定为页, 使用页代码来标示。
10) 队列标识:用来区别不同的I/0处理的标记。
11) 重新连接:为了继续I/O处理所进行的恢复性的连接。目标连接到起始器时:获得仲权之后经过RESELECTION和MESSAGE IN阶段完成。起始器和目标连接的时候:获得总线仲裁权之后,经过SELECTION和MESSAGE OUT阶段后完成。
12) SCSI地址:分配给SCSI设备的16进制地址。在系统安装的时候这个地址就被分配并且设定到SCSI设备中了。(SCSI_ID的编码是不同的,SCSI_2是采用了有效位的形式;而SCSI_3采用了数值的形式.)
13) SCSI ID:对SCSI地址的描述。
14) SIGNAL ASSERTION:使信号变为有效状态。
15) SIGNAL NAGATION:使信号变为无效。(高阻状态)
16) 状态:每个命令完成之后,从目标发送到起始器的一个字节的信息。
17) AEN:异步事件通知。
18) LSB:LEAST SIGNIFICANT BIT(低位)
19) MSB:MOST SIGNIFICANT BIT(高位)
20) LUN:逻辑单位号
2. SCSI通讯的八个阶段
在SCSI体系结构中有8个截然不同的阶段:
1) 总线自由阶段;
SEL 和 BSY信号FALSE.
在一般的情况下,只要TARGET使 BSY信号变为高阻状态,就表示进入BUS FREE阶段.但是有时侯SELECT / RESELECT 阶段出现超时的情况下,只要SEL信号变为高阻状态就代表进入了BUS FREE阶段.
在下列条件时,TARGET可以发BSY信号,进入BUS FREE阶段:
a. 检测到RESET信号
b. TARGET接收到ABORT消息
c. TARGET接收到BUS SERVICE RESET 消息
d. INITIATOR接收到DISCONNECT消息
e. INITIATOR接收到COMMAND COMPLETE消息
f. TARGET接收到RELEASE RECOVERY消息
g. TARGET 接收到ABORT TAG消息
h. TARGET接受到CLEAR QUEUE消息
在1其它时候,如果INITIATOR接收到了BSY信号,那么TARGET应该发出错误情况给INITIATOR.
2) 仲裁阶段:
这个阶段允许一个SCSI设备获得SCSI BUS的控制权.这样就可以开始一个I/O 处理或者继续从前的I/O处理.
获得SCSI总线控制权的过程如下:
a. 等待BUS FREE阶段的出现,(BSY  SEL信号同时变为高阻抗状态,并保持保持一段时间.)
b. 经过一段时间的延时,SCSI设备就会是BSY信号有效,并且发出各自的SCSI ID.
c. 经过一段时间后,SCSI 设备就会检查DATA BUS,这个时候各个SCSI 设备就餐会比较SCSI ID,看是否有更高优先权的SCSI 的设备出现,如果发现了更高优先权的SCSI 设备,则当前设备就会回到等待BUS FREE的状态,如果没有更高有限优先权的SCSI设备出现,那么当前SCSI 设备就会使SEL信号有效.这时候其它没有赢得总线的SCSI 设备会使BSY信号,和自己的SCSI ID变为高阻态.
赢得总线的SCSI 设备会在仲裁阶段结束之前,保持BSY SEL信号有效.同时它将成为INITIATOR.
3) 选择阶段;
在这个阶段中,INITIATOR会去选择一个TARGET,在选择阶段I/O信号是高阻态(这样可以区分重新选择阶段).INITIATOR将会设定数据总线为INITIATOR和TARGET ID相或的结果,同时使ATN信号有效。然后等待一段时间后使BSY信号变为高阻态。而这个时候TARGET都会检查自己是否被选中,如果被INITIATOR选择,TARGET设备就会检查总线,取得INITIATOR的ID号。在BSY高阻态后,TARGET会使REQ信号有效。这样就进入了信息传输阶段。
4) 重新选择阶段;
这是一个可选的阶段,有时候目标也会再选择一个其他的起始器,这种处理将会在这个阶段完成。
5) 命令阶段
在REQ/ACK握手信号中,插入了C/D信号,屏蔽了I/O  MSG信号。
6) 数据阶段
包括数据导入阶段(数据从目标到起始器,使用了I/O信号)和数据导出阶段(数据从起始器到目标)
7) 状态阶段
状态信息将会从目标被送到起始器中。C/D, I/O信号将会被使用,MSG被屏蔽。
8) 消息阶段

COMMAND ,DATA, MESSAGE, STATUS都包含在信息传输阶段。
C/D, I/O, MSG这些信号用来辨别不同的阶段。TARGET会利用这三个信号来控制不同阶段之间的转换。INITIATOR可以通过使ATN信号有效,来请求MESSAGE OUT阶段。TARGET也可以通过使C/D, I/O, MSG, BSY信号无效来进入一个BUS FREE阶段。
信息传输阶段将会使用ACK/REG握手信号来完成传输,每一次ACK/REG握手都会传送一个字节的内容。在信息传送过程中,BSY信号始终是有效的。而SEL信号是高阻状态。在利用ACK/REG进行传输的过程中,C/D, I/O, MSG这些信号也会被封装进去,从第一次握手的REG有效开始到最后一次握手的ACK无效为止,这些信号会一直保持有效。(对于不同的阶段,BSY , SEL, REQ, ACK, REQB, ACKB都是不变的.而C/D, I/O, MSG, DATA BUS信号是需要改变的.如下图所示.)

当改变数据总线的方向时,C/D , I/O, MAG, DATA BUS信号会发生变化,当方向变为:IN(起始器驱动变为目标驱动),起始器释放数据总线, I/O信号变为真.反之,目标释放数据总线, I/O信号变为高阻态.(ATN,RST会在定义的前提下进行变化.)

注:
在选择阶段之后的第一个消息应该是:IDENTIFY, ABORT, BUS DEVICE RESET消息,如果目标接收到其他消息,他将转移到总线自由状态.
如果如果第一个消息是IDENTIFY,他后面将跟随很多其他的消息,例如同步数据传输请求消息.这种IDENTIFY消息可以确立一个起始器和目标之间的连接.在重新选择阶段后,目标的的第一个消息就是IDENDTIFY,这样一来可以重新建立一个I_T_L连接或者I_T_R连接,(起始器需要确保当前指针和保留指针相等)
 
              

例子:一个SCSI命令处理过程:
下面是关于READ命令的说明(不包含错误处理)
起始器中包含很多个保留指针,它们是支持并发管理的.同时在起始器中还有一系列活动指针分别为:命令,状态,数据指针.
首先,起始器把保留指针指向I/O处理过程中需要用到的数据位,然后将保留指针拷贝给当前的活动指针,起始器对总线进行仲裁,直到获得了仲裁权.然后起始器会选择一个目标,一旦某一个目标被选中,它将会承担I/O处理的控制任务.
进入”选择阶段”,起始器首先发出一个ATN信号,通知目标起始器将要发送消息了.目标就会进入出消息阶段.这时候起始器会发出IDENTIFY消息,这个消息将通知目标使用什么样的逻辑单元.这时候一个” 起始器_目标_逻辑单元”关系就建立起来了.这种连接也将起始器的指针和I/O处理联系起来了.(逻辑单元:处理过程中使用的数据存储单元)
目标进入了命令阶段,起始器将发出一个命令描述块,这个命令描述块中包含了将要处理的READ命令.目标在解析命令之后就进入” 数据进入阶段”(READ命令不需要执行任何其它动作).
在数据进入阶段中传输数据给起始器.
然后进入” 状态阶段”,这个阶段发送GOOD信号给起始器
随后进入了” 消息进入阶段”,发送一个命令完成消息给起始器,
最后目标在释放BSY信号后进入了自由总线状态.

例子:
一个通讯的事例(SCSI信号描述)
1) BUS FREE阶段:
SEL BSY信号变为高阻状态,并且保持一定时间(总线决策时间),这时候系统就处于BUS FREE阶段,直到BSY信号有效.BUS FREE阶段结束.
2) ARBITRATION 阶段:
当INITIATOR检测到BUS FREE阶段时,它就会使BSY信号有效,同时把自身的SCSI ID发送到数据总线上.在经过一个仲裁延时之后,INITIATOR就会检查数据总线,如果发现了更高优先级的SCSI ID,则当前的INITIATOR就会放弃仲裁,同时释放BSY信号和SCSI ID信号.相反,赢得了仲裁权的INITIATOR会使SEL信号有效.当SEL信号有效后,其他的所有INITIATOR必须在一个固定的延迟时间中释放BSY信号和各自的SCSI ID信号.这样就进入了选择阶段.
3) SELECT阶段:
在这个阶段中,I/O信号保持高阻状态,用来区别RESELECT阶段.对于有仲裁阶段的系统,这个阶段就会将TARGET ID和INITIATOR ID信号发送到数据总线上.经过一段时间的延迟后,使BSY信号变为高阻状态.这时候TARGET就会检查自己是否被选中,如果发现自己被INITIATOR被选中,TARGET就会使BSY信号有效.当INITIATOR检查到BSY信号有效,它就会释放SEL信号.
4) MESSAGE OUT阶段:
在这个阶段中,INITIATOR会发送IDENTIFY消息给TARGET.为了进行信息传输。TARGET会使C/D, MSG信号有效,而使I/O信号变为高阻状态.在检测到REQ信号有效之后,INITIATOR在使ACK信号有效之前会使ATN信号变为高阻状态。
5) COMMAND 阶段:
为了完成数据的传输,TARGET会使C/D信号有效,使I/O,MSG信号变为高阻状态。握手处理:TARGET使REQ信号有效,INITIATOR检测到REQ信号之后,就会将数据发送到总线上,然后等待一个时间间隔后,使ACK信号有效。TARGET会检测到ACK信号,然后使REQ信号变为高阻状态。TARGET可以通过继续使REQ信号有效的方式来获得命令数据。命令位的数量是由包含在第一个命令字节中的“组代码”确定的。
6) DATA IN阶段:
TARGET会使I/O信号有效,使C/D,MSG信号无效,来完成这个阶段的数据传输。
握手处理:TARGET使REQ信号有效,直到接收到ACK信号。INITIATOR会在接收到REQ信号后,去读取数据总线上的数据,然后使ACK信号有效。当TARGET检测到ACK信号有效,TARGET就会使REQ信号变为高阻状态,INITIATOR随后也会将ACK信号变为高阻状态。这样一次通讯完成,传送了一个字节的信息。
7) DATA OUT阶段
TARGET会使C/D,I/O,MSG信号变为高阻状态。
8) STATUS阶段:
C/D,I/O信号有效,MSG信号无效。
9) MESSAGE IN阶段:
TARGET会使C/D,I/O,MSG信号有效。这时候会发送COMMAND COMPLETE 消息。
10) BUS FREE阶段:
这个时候TARGET会使BSY信号变为高阻状态。

3. 数据传输方式(同步,异步)
1) 异步数据传输:
目标将会通过I/O信号的方法控制信息传送的方向。当I/O信号为真时,信息从目标传送到起始器,反之,由起始器传送到目标;
当I/O为真的时候,目标首先通过数据总线发出一个REQ信号。起始器收到REQ信号之后发出一个ACK信号。目标收到ACK后,会再次重复上面的过程,直到完成数据的传输。
2) 而同步数据传输,TARGET会按照指定时间间隔发送ACK,并不会等待ACK信号。
注:
同步数据传输和异步数据传输的差异:REG/ACK发出的时机不同,同步传输是按照固定的时间间隔发送REG/ACK握手信号,异步传输是在确认接收到数据之后才会发送REG/ACK.

4. SCSI 总线条件:
SCSI总线有两个异步情况:警告情况,复位情况.这些情况的出现将改变程序的”阶段”顺序.并且使SCSI设备执行一些特定的功能.
1) 警告条件:当INITIATOR准备好一个消息时,它会通知TARGET通过进入MESSAGE OUT阶段来获得消息.除了BUS FREE,ARBITRATION阶段的任何时候,INITIATOR都可以通过是ATN信号有效的方式,通知TARGET进入MESSAGE OUT阶段.(在信息传诵过程中,ATN信号会一直保持有效, 直到信息的最后一个字节通过ACK/REQ握手信号传输后,ATN信号才会变成高阻状态; 在不同阶段中,如果ATN信号有效, 则会在当前阶段完成后,进入MESSAGE OUT阶段.)
 
2) 复位条件:这个条件用来清除SCSI总线上的所有SCSI设备,它的优先权是最高的,不论当前通讯所处的状态如何,只要RST信号保持1分钟有效,所有的SCSI设备就会进入BUS FREE阶段.这种复位所带来的影响就是SCSI设备会被保留,并且SCSI设备的操作模式会被检测出来.(INQUIRY命令响应数据中的SFTRE位用来报告系统内部的复位是”硬件复位”还是”软件复位”)
“硬复位”清除所有的I/O处理
          释放被保留的SCSI设备
SCSI设备的工作模式会恢复到上电复位后的状态.
ATTENTION CONTION设定.
“软复位”完成当前没有完成的I/O处理
保存被保留的SCSI设备.
保存SCSI操作模式
保存继续进行I/O处理分配所必须的信息.
P88NEED TO SEE AGAIN

5. SCSI指针的介绍
SCSI提供了三个指针完成每一个I/O处理,其中一个指针用于命令,一个指针用于状态,另外一个用于数据.在进行I/O处理时,三个指针被拷贝到起始器的三个当前指针中,这三个指针指向将要被传输的命令,数据,状态.所保留的命令指针一直指向命令描述块的起始地址,状态指针指向进行I/O处理的状态区域的起始地址,数据指针在目标发送一个SAVE DATA POINTER消息之前一直指向数据快的起始地址.在起始器响应SAVE DATA POINTER消息的时候,起始器将当前数据指针保存在数据保存指针中.目标将通过发送一个RESTORE POINTERS把当前指针恢复为所保存的指针的值,起始器然后会拷贝保留指针的值到当前指针中.当目标断开连接之后,仅仅是存储指针被保留.当前指针将在重新连接的时候由存储指针来恢复.
6. 队列化的I/O处理:
I/O处理队列话是可以选择的,这种队列化的处理方式可以使TARGET接收多个I/O处理。
队列处理分两种类型:标记和非标记队列处理。标记队列处理可以接收来自每个INITIATOR的多个I/O处理。而非标记队列处理可以接收来自于每个INITIATOR的一个I/O处理。标记对列是在SCSI-2中增加的新功能。
1)非标记队列:
2)标记队列:
3)队列化I/O处理的例子:
使用标记队列的I/O处理会通过如下流程执行程序:INITIATOR首先仲裁总线,在成功获得总线后,INITIATOR就会去选择适合的设备。在选择阶段ATN信号会始终保持有效,通过这种方式通知TARGET进入到MESSAGE OUT阶段。首先传送的消息是IDENTIFY消息。在MESSAGE OUT阶段ATN信号依旧保持有效状态,这样说明INITIATOR还有其它的消息需要发送给TARGET. 随后传输第2字节的信息是相应队列标记消息的第一个字节(在这个例子中是一个SIMPLE QUEUE TAG消息)。直到所有消息传送完毕,ATN信号变为高阻状态(显示所有数据传送完成)。这时候TARGET会开始接收命令描述块,假设命令需要断开连接,那么TARGET接收到命令之后,就会发出一个DISCONNECT消息给INITIATOR,然后进入到BUS FREE状态。TARGET会把命令发到命令队列中的相应位置。在TARGET从命令队列中取出命令执行的时候,会有一个固定的等待周期。这个周期结束后,如果TARGET需要传送相应的数据,那么TARGET就会进入到仲裁阶段(INITIATOR选择TARGET),在获得总线之后,进入重新选择阶段(TARGET选择INITIATOR),完成重新选择之后,TARGET会发送一个IDENTIFY 消息,随后是一个SIMPLE QUEUE TAG消息(其中含有INITIATOR开始发送过来的队列标记),INITIATOR会针对相应的I/O处理来配置指针,数据块等数据传输条件。TARGET开始进行数据传送,在完成数据传送之后,TARGET会进入到状态阶段,发出一个GOOD状态,并且通过COMMAND COMPLETE消息来终止当前的I/O处理。
[注:在命令队列处理执行时,应该有适合的算法保证更高的效率(可以按照逻辑块地址的顺序执行命令)。]

7. UNIT ATTENTION CONDITION(单位警告条件)
    在某些情况下,TARGET会对受影响的逻辑单元产生UNIT ATTENTION CONDITION:
1) BUS DEVICE RESET消息复位
2) 或者由于硬件复位
3) 上电复位
4) 可移动媒体被更换
5) 对于一个INITIATOR有效的模式参数被其他INITIATOR改变。
6) 微代码的版本发生变化。
7) 一个INITIATOR的标记命令队列被其他的INITIATOR清空。
8) INQUIRY数据被改变。
9) 模式参数被恢复。
10) 异步传输

8. 对于所有的SCSI设备通用的三个命令的介绍:INQUIRY、TEST UNIT READY、REQUIRE SENSE。
9. 消息系统描述:

 

2) 消息中的第一个字节确定了消息的格式.
3) 在消息阶段,有有可能会发送一个或者多个消息.
4) 在选择阶段后的的第一个消息应该是:IDENTIFY, ABORT, BUS SERVICE中的一个,如果TARGET接收到其他的消息,那么TARGET会视为异常,而进入BUS FREE阶段.
5) 如果第一个消息是IDENTIFY消息,那么它后面应该会跟随其他的消息,例如:同步数据传输请求消息.
6) 在重新选择阶段,TARGET接收到的的第一个消息也应该是IDENTIFY消息.这样就可以建立一个连接.如果TARGET接收到一个带有其他逻辑单元号的IDENTIFY 消息,则进入BUS FREE阶段.

在断开连接时,应该有一个保存指针的操作.(INITIATOR完成)
 
10. 宽数据传输:
 
11. 补充说明
1) CHECK CONDITION:当CDB中出现异常时,INITIATOR所接收到的状态.
2) 3BIT的组代码(命令长度),5BIT的命令代码(命令代码).总共可以合成256种可能.
3) SCSI芯片的内部命令可以驱动芯片,产生各种总线信号 BSY , SEL, C/D, I/O, MSG, REQ, REQB, ACK, ACKB, ATN.
12. 一些SCSI通讯芯片原理的介绍(DMA原理、ROM旁路、FIFO直接访问。。。。。。)
「待续」


最新喜欢:

milkywaymilkyw... flytomoonflytom...
li_qingsong
驱动牛犊
驱动牛犊
  • 注册日期2003-07-03
  • 最后登录2004-08-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-09-15 15:34
抛砖引玉、希望能结交对SCSI通讯有兴趣的朋友。
illdragon
驱动牛犊
驱动牛犊
  • 注册日期2003-08-04
  • 最后登录2005-03-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-09-22 09:20
我有兴趣,是你自己总结的吗,那就太牛了
我现在正在从事SCSI方面的开发
qingfengy
驱动牛犊
驱动牛犊
  • 注册日期2004-02-26
  • 最后登录2005-11-08
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-02-26 11:03
我也有兴趣
smartsheep
驱动牛犊
驱动牛犊
  • 注册日期2004-11-30
  • 最后登录2007-04-27
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-05 15:57
谢谢你的帖子,你写得很详细,但偏偏下面这条没写详细,而我的USB开发就恰恰在INQUIRY命令后接下去的TEST命令出错。这会是什么原因呢?
8. 对于所有的SCSI设备通用的三个命令的介绍:INQUIRY、TEST UNIT READY、REQUIRE SENSE。
游客

返回顶部