I/O 技术实现在计算机和存储设备之间的数据交换。实现从CPU 到存储系统的I/O通路的一个中间就是SCSI(Small Computer System Interface).
一. I/O 通路
在计算机中,一个或多个CPU 处理在CPU缓存或主存储器(RAM:Random Access Memory)中的数据。 CPU缓存或主存储器是非常快的器件,但是断电就不能保存,价钱也比较昂贵。 所以数据还需要放在存储设备上。
通常,数据从主存储器(RAM)通过系统总线,主机I/O 总线 和 I/O 总线移动到磁盘或者磁带等存储设备。
1.1 系统总线
在计算机的核心部分,系统总线保证数据在CPU和主存储器之间进行快速的传递。 系统总线必须使用非常高的时钟频率,使得它能够足够快的给CPU 提供数据。 该总线的实现采用在主电路板上印制导线的形式。 出于物理性能的原因,高的系统速度需要短的印制导线。 因此,系统总线应该尽可能的短一些,并且只能连接CPU和主存储器。
1.2 主机I/O 总线
在现在计算机中,为了释放CPU 的应用处理负担,人们把尽可能多的任务移到诸如图像处理器这样的特别的处理器中。 由于上述物理上的限制条件,这些器件不可以连接到系统总线。 因此大多数计算机都实现了称作主机I/O总线的第二个总线。 桥接芯片提供在系统总线和主机I/O总线之间的连接。 PCI(Peripheral Component Interconnection:外围互联设备)是当前最广泛使用的实现主机I/O 总线的技术。
1.3 I/O 总线
设备驱动器负责控制外围设备以及与外围设备的通信。针对存储设备的设备驱动器部分以软件形式存在,该软件由CPU处理。由于跟存储设备通信的部分设备驱动器几乎总是以固件的形式实现,该固件由特别的处理器(ASIC:Application Specific Integration Circuit)处理。 当前这些ASIC 有的集成到主电路板(如SCSI 控制器),也有的通过附加的PCI卡连接到主板。 这些附加的卡通常被称作控制器。 存储设备通过主机总线适配器(HBA:Host Bus Adapter)或者通过在板上的控制器连接到服务器。 在控制器和外围设备之间的通信连接叫作I/O总线。
当前用户I/O 总线的最重要的技术是SCSI 和光纤通道。 SCSI 定义了一种总线,该总线能够连接16个设备(包括服务器和存储设备)。 在另一方面,光纤通道定义存储网络的不同拓扑结构,该存储网络可以连接数百万个设备(包括服务器和存储设备)。 作为替代光纤通道的其他选择,工业界正在使用TCP/IP 和以太网(IP存储)实现存储网络。 注意的是,这些新技术都是继续使用SCSI 协议在设备间通信。
二. 并行SCSI 总线
把磁盘和磁带设备连接到应用服务器或文件服务器,最常用的方法就是通过传统的 SCSI总线。尽管 SCSI主要是一个块协议,但这个术语也被用来指称运行该协议的并行线缆机制。
最初的 SCSI物理层传输介质是一种并行电缆,由 8根数据线和一些控制线构成。在每个发送时钟里传输 8 位数据,传输速率相对说来是比较高的;但是由于电气方面的问题,使得多数SCSI设备所允许的传输距离被限制在 15-25 m左右。随着时间的推移,SCSI 并行总线的性能一直在提高,并通过提供更多的数据通路 (例如采用 16 位数据线和32位数据线)和更快的时钟,得到了更大的带宽。
并行总线存在的一个问题是飘移现象。如果把一组并行的多位数据同时发出,每条数据线上的传输延迟会出现差异,导致各个位不会在精确的同一时间到达目的地。所谓飘移指的是一个时间窗口,所有的数据位在这段分布的时间内都能到达目的地。各个传输线上传输延迟的差别越大,飘移窗口也就越大。根据传输线理论,总线中每条线路的传输阻抗 (包括容抗和感抗)跟它所处的位置有关,因此,传输延迟是位线所处的物理位置的函数。对于给定长度的线缆,要想增加时钟频率,就必须减小飘移窗口,从而最小化线路间的传输延迟差。显然在高频条件下,电缆越长,飘移窗口越大。
SCSI 规范的第 1 个版本发布于 1986 年。自那时以来,它被广泛应用于服务器和高档 PC 中,其速率由最初的4 MBps发展到现在的 320 MBps,而且还在提高着。
作为一种介质,SCSI定义了一个并行总线,用于数据传输和通信控制。总线本身可以是印制导线的形式,也可以是一根电缆。外部 SCSI设备使用电缆以菊花链的形式连接到服务器上的控制器。在菊花链中,每个设备都跟其他设备串接。由于这个原因,外部 SCSI设备典型地都有两个 SCSI连接器,可以分别连接到链中的前一个设备和后一个设备。现在的一个 SCSI 总线可以连接多至 16个设备。其中包括1 个SCSI控制器和 15个存储装置。
2.1 SCSI 类型
SCSI有三个基本规范:
SCSI-1:SCSI-1是在1986年开发的原始规范,现已不再使用。它规定总线宽度为8位,时钟速度为5MHz。
SCSI-2:1994年采用,此规范包括通用指令集(CCS)——支持任何SCSI设备所必需的18个命令。在此规范中,可以选择将时钟速度提高一倍,达到10MHz (Fast),将总线宽度增加为原来的两倍,即16位,将设备数增加为15个(Wide),或者同时实现上述两种升级(Fast/Wide)。SCSI-2还增加了命令队列,允许设备存储命令,并从主机排列命令优先级。
SCSI-3:此规范于1995年正式出台,包括一系列较小范围的标准。涉及SCSI并行接口(SPI)的一组标准在SCSI-3中得到了继续发展,SPI是SCSI设备之间的通信方式。大多数SCSI-3规范都以Ultra开头,如Ultra for SPI规范、Ultra2 for SPI-2规范和Ultra3 for SPI-3规范。名称中的Fast和Wide的含义与SCSI-2中的一样。SCSI-3是当前正在使用的标准。
双倍总线速度、双倍时钟速度和SCSI-3规范的不同组合,产生了许多不同的SCSI规范。下表对几种不同规范进行了比较。很多较慢的规范已不再使用——在此列出仅作比较之用。
名称 |
规范 |
设备数量 |
总线宽度 |
总线速度 |
Mbps |
异步SCSI |
SCSI-1 |
8 |
8位 |
5MHz |
4Mbps |
同步SCSI |
SCSI-1 |
8 |
8位 |
5MHz |
5Mbps |
Wide |
SCSI-2 |
16 |
16位 |
5MHz |
10Mbps |
Fast |
SCSI-2 |
8 |
8位 |
10MHz |
10Mbps |
Fast/Wide |
SCSI-2 |
16 |
16位 |
10MHz |
20Mbps |
Ultra |
SCSI-3SPI |
8 |
8位 |
20MHz |
20Mbps |
Ultra/Wide |
SCSI-3SPI |
8 |
16位 |
20MHz |
40Mbps |
Ultra2 |
SCSI-3SPI-2 |
8 |
8位 |
40MHz |
40Mbps |
Ultra2/Wide |
SCSI-3SPI-2 |
16 |
16位 |
40MHz |
80Mbps |
Ultra3 |
SCSI-3SPI-3 |
16 |
16位 |
40MHz |
160Mbps |
Ultra320 |
SCSI-3SPI-4 |
16 |
16位 |
80MHz |
320Mbps |
除了总线速度提高之外,Ultra320 SCSI还使用分组化数据传输,从而提高其效率。Ultra2也是最后一种具有“窄”(8位)总线宽度的规范。
所有这些SCSI类型都是并行的——数据通过总线同时传输,而不是一次传输一种数据。最新的SCSI类型称为串行连接SCSI(SAS:Serial Attached SCSI),这种连接使用SCSI命令,但以串行方式传输数据。SAS使用点对点串行连接,以3.0千兆位每秒的速度传输数据,每个SAS端口可以支持多达128个设备或扩展设备。
2.2 SCSI的控制器、设备和电缆
SCSI控制器在SCSI总线上的所有其他设备和计算机之间进行协调。SCSI控制器也称为主机适配器,控制器既可以是插入可用插槽的卡,也可以内置在主板上。SCSI BIOS(Basic Input output System)也在控制器上。它是一个小型ROM或闪存芯片,包含访问和控制总线上的设备所需的软件。
每个SCSI设备都必须具有唯一的标识符(ID)才能正常工作。例如,如果总线能够支持16个设备,通过硬件或软件设置指定的设备ID的范围为0-15。SCSI 控制器本身必须使用其中一个ID,通常是最高的那一个,而将其他ID留给总线上的其他15个设备使用。
内部设备通过带状电缆连接到SCSI控制器。外部SCSI设备使用一条粗的圆形电缆,以菊花链形式连接到控制器(串行连接SCSI设备使用SATA电缆)。在菊花链中,每个设备都依次连接到下一个设备。因此,外部SCSI设备通常具有两个SCSI连接器——分别连接前后两个设备。
电缆本身通常由三层构成:
(1)内层:保护性最好的层,包含实际发送的数据。
(2)介质层:包含向设备发送控制命令的线路。
(2)外层:包含传输奇偶校验信息的线路,这些信息可确保数据的正确性。
不同SCSI标准使用不同的连接器,这些连接器通常不兼容,通常使用50、68或80针。SAS使用较小的SATA兼容连接器。
一旦总线上的全部设备安装完毕,而且分配了各自的ID,则总线的每一端都必须闭合。下面介绍如何执行这一操作。
2.3 终接器
如果SCSI总线保持开放状态,沿总线发送的电信号会反射回来,从而干扰设备和SCSI控制器之间的通信。解决方法是终结总线,用电阻电路闭合每一端。如果总线同时支持内部和外部设备,则必须终结每个系列的最后一个设备。
SCSI 终结的类型主要可分为两类:被动(无源)和主动(有源)。
(1)被动(无源)终结通常用于在标准时钟速度下运行、且设备到控制器的距离小于1米的SCSI系统。
(2)主动(有源)终结用于Fast SCSI系统,或设备到SCSI控制器的距离大于1米的系统。
SCSI还使用三种不同类型的总线信令,这也会影响终结。电脉冲以信令的方式在线路上发送。
(1)单端(SE:Single-ended):控制器生成信号,并通过单条数据线将信号传送至总线上的所有设备。每个设备都会产生信号损失。因此,信号会很快开始衰减,由此SE SCSI的传输距离被限制为约3米以内。PC中普遍采用SE信令。
(2)高压差动(HVD:High-Voltage Differential):HVD常用于服务器,它以串联方式发送信号,采用一条数据高压线和一条数据低压线。SCSI总线上的每个设备都有信号收发器。控制器与设备通信时,总线沿途的设备接收信号并转发信号,直至信号到达目标设备为止。这样,控制器和设备之间的允许距离可显著增加,可达25米。
(3)低压差动(LVD:Low-Voltage Differential):LVD是HVD的同类技术,工作原理非常相似。两者之间的差异在于,LVD的收发器更小,并且内置于每个设备的SCSI适配器中。这使得LVD SCSI设备的价格更合理,并且LVD使用更少的电量就可以通信。缺点在于最大距离仅为HVD的一半——12米。
HVD和LVD通常都使用被动终结器,即使设备和控制器之间的距离远大于1米也是如此。这是因为收发器可以确保信号足够强,能从总线的一端传输到另一端。
三. SCSI 协议
在SNIA 共享存储模型中,SCSI 负责从上层接收请求并转发,或者从并行设备获取数据并转发。
例如:有一个应用程序向操作系统发出对磁盘设备的写请求。 在SCSI协议层,这个写请求被看成是特定数量的数据块以协议的形式传递到指定位置的命令。作为操作系统和存储设备之间的一个中介,SCSI 协议既不规定数据块如何组织,也不规定怎样把数据块放到磁盘上。 在SCSI把数据块发送到目的地时,目标方可能是单个物理磁盘,也可能是把数据块在多个物理盘上分条存放的RAID 控制器。 SCSI 协议的责任,就是在确认写操作已经正确完成后向操作系统报告成功,而不管在磁盘上物理存储是如何配置以及写操作是如何执行的。
3.1 SCSI 域
SCSI 设备是在一定的环境中运行的。 通常需要有多个SCSI设备才能形成这样的环境。 SCSI 设备间的运行环境也称为SCSI域。在这个域内,生成和发送SCSI命令和任务管理请求的SCSI端口称为SCSI发起方,接收和处理SCSI命令,根据请求执行任务管理的端口称为SCSI目标方。
SCSI 域的组成包括SCSI设备,设备内的SCSI 发起方和目标方以及提供数据交接的总线。 SCSI总线连接了挂在它上面的所有SCSI设备。我们可以把一个实际的SCSI应用系统抽象为一个SCSI域,域中有多个SCSI设备,而且带SCSI驱动器的计算机也可以被看成是一个SCSI设备。
尽管可以允许有多个SCSI设备接在同一条总线上,SCSI协议实际定义的是设备间一对一的数据交换,即同一时刻在SCSI总线上只允许有两个设备互相交换数据。因为,SCSI上的各个设备是以分时共享的方式使用总线的。
在一个实际的SCSI域中,必须至少有一个发起方和1个目标方,考虑到主机对数据存储的需求,配置了SCSI控制器的主机至少有1个SCSI发起方。而磁盘设备主要是提供存储和数据服务,一般都有目标发。
3.2 SCSI 协议模型
为了便于实现和理解SCSI的各个协议,SCSI 采取了分层结构。 SCSI 大致可分为三层,即SCSI应用层,SCSI 传输层和SCSI 互连层。 SCSI中的各个具体协议一般都位于其中的某一层,可以可能跨越两层。
在应用层,SCSI 体系结构把发起方(主机)和目标方(如磁盘)的通信定义为客户/服务器交换。SCSI 客户位于主机中,代表上层应用程序,文件系统和操作系统I/O请求。 SCSI 设备服务器位于目标设备中,对请求做出响应。 客户/服务器请求和响应通过某种形式的底层协议进行传输。
在传输协议层,SCSI 设备之间通过一系列的命令实现数据的传送,大致分成三个阶段:命令的执行,数据的传送和命令的确认。
SCSI 互联层完成SCSI设备对总线的连接以及发送方和目标方的选择等功能。
3.3 寻址机制
为了对连接在总线上的设备寻址,SCSI 协议引入了SCSI设备ID 和逻辑单元号LUN. 在SCSI 总线上的每个设备都必须有一个唯一的ID,其中包括服务器中的主机总线适配器也拥有设备ID.取决域SCSI标准的版本,每条总线最多可允许有8个或者16个设备ID。
诸如RAID 磁盘子系统和磁带库这样的存储设备可能包括若干个子设备,如虚拟磁盘,磁带驱动器和介质更换器等。 因此SCSI 引入了逻辑单元号,以便于对大的设备中的子设备进行寻址。另外一个服务器可能配置了多个SCSI控制器,从而就可能有多条SCSI总线。 因此,操作系统用一个三元描述标识一个SCSI目标: 总线/目标设备/逻辑单元号
传统的SCSI 适配卡连接单个总线,相应的只具有一个总线号。 在引入存储网络之后,每个光纤通道HBA(Host Bus Adapter)或iSCSI(Internet SCSI)网卡也都连接一条总线,分配一个总线号,在他们之间依靠不同的总线号加以区分。
目标设备标识在一条总线菊花链上的单个设备,逻辑单元号则表示一个目标设备中的一个子设备。 通常,单个物理磁盘只具有一个逻辑单元号,而RAID磁盘阵列虽然也只有一个目标设备,但却有多个逻辑单元号。
在一条总线上各个设备具有不同的优先级。起初的SCSI 协议只允许有8个目标设备ID,规定ID7 具有最高权限。后来版本的SCSI 协议允许有16个不同的目标设备ID。出于兼容性的考虑,从7到0的目标设备依然具有高优先级,而从15到8的设备ID具有较低优先级。
设备(服务器和存储设备)在可以通过SCSI 总线发送数据之前必须预定总线(仲裁)。 在总线的仲裁期间,具有最高优先权的目标设备总能获胜。 在总线负载重的情况下,这可能导致具有较低优先级的设备总是不被允许发送数据,因此,SCSI的仲裁过程是不平等的。
出于配置和管理的需要,操作系统使用总线号/目标设备ID/逻辑单元号三元组来标识一个SCSI目标,然而用户和应用程序所看到的只是一个逻辑标识符,如D盘。 因此在总线号/目标设备ID/逻辑单元号和逻辑盘符之间存在着一个映射,提供在物理设备和上层文件系统之间不同表示形式的转换。
3.4 交互方式
SCSI协议把发起方 (主机)和目标方 (例如磁盘)之间的交互定义为客户/服务器方式。应用客户位于主机中,代表上层应用程序、文件系统和操作系统的 I/0 请求。设备服务器位于目标设备中,它响应客户的请求。请求和响应通过某种形式的下层分布设施进行传输,该分布设施称作分布子系统,可以是并行电缆,也可以是光纤通道协议或iSCSI。
一个发起方可能会有多个请求同时发给目标方。多个请求产生应用客户的多个实例,从而在设备服务器上产生多个事务。
发起方在其发往一个或多个目标的多个请求正在被相关的设备服务器处理的时候,需要能够执行上下文交换 (Context Switching),即具有从一个任务快速切换到另一个任务的能力。例如,作为一个发起方的文件服务器可以向一个目标方发送一个写请求。‘当该文件服务器在等待这个目标方准备好缓冲区以接收数据的那段时间内,可以切换到另一个挂起的任务,例如处理已经到达的对先前的另一个请求的响应,从而提高运行效率,最大化吞吐量。如果SCSI任务只能依次串行地执行,那么等待每个写或读请求完成的时间就都被白白地浪费了。一般来说,上下文交换是由主机适配卡完成的,可以是并行 SCSI,也可以是光纤通道或iSCSI。
由于 SCSI体系结构模型是层次化的,因此它对主机I/0请求的处理可以独立于底层的分发子系统。一个应用客户主机可以处理涉及不同种类的目标设备的 I/0 操作,例如一个应用服务器可以有直接附接的 SCSI 目标方,也可以有通过千兆位速率接口连接的串行SCSI 目标方。
在SCSI发起方和目标方之间读写数据是通过SCSI命令、分发请求、分发操作和响应来完成的。SCSI命令和参数在 CDB (Command Descriptor Block,命令描述块)中指定。作为交互示例,在执行对磁盘的 SCSI写过程时,在发起方 (例如主机总线适配器)创建一个应用客户,该客户发送SCSI命令请求给目标方,令其准备缓冲区以接收数据。目标设备服务器在其缓冲区准备好之后,发送一个数据分发操作请求进行响应。接着,发送方就执行分发操作,开始发送数据块。依赖于底层的分发子系统,数据块可能按字节并行传输 (例如并行 SCSI 总线),也可能以分段成帧的形式串行传输 (例如光纤通道或iSCSI)。
从应用程序或操作系统的角度看,写操作只是一个事务。但实际上,对应一个写操作,发送方和目标方可能要进行多次的分发请求和分发操作的交互,才能把命令请求的所有数据都发送给目标方。
在一次读操作中,SCSI命令块遵循相反的数据分发请求和确认序列,然而由于是发起方发出读命令,所以命令就假定自己已经准备好了缓冲区以接收第 1 批数据块。在读写事务的每个阶段所发送的数据块数量,由发起方和目标方根据对方的缓冲区容量协商决定。例如,高性能磁盘阵列一般都能提供较大的缓冲区,可以完成大规模的数据传送,从而提高了产品性能。
3.5 SCSI总线信号
SCSI在物理信号的基础上定义了一组总线信号。这些信号可划分为数据信号和控制信号两类。它们都是二进制信号,并且只有“真”和“伪”两个稳定状态。其中有指示总线已经被占用的“BSY”信号,有清除并重新设置SCSI总线的“RST”信号等。
下面对这些信号的名称和功能逐一进行介绍。
1. BSY (Busy,忙)信号
该信号是“或态”信号,表示已经有设备占用总线。
2. SEL (Select,选择)信号
该信号是“或态”信号,由发起方用以选择目标方,或者由目标方用以重新选择发起方。
3. C/D (Control/Data,控制/数据)信号
该信号由目标方驱动,表示在数据总线上传送的是数据信号还是控制信号。该信号处于真状态时表示控制信号。
4. I/O(Input/Output,输入输出)信号
该信号由目标方驱动,控制数据在数据总线上的移动方向。当 I/0 信号为“真”时表示是对发起方的输入,数据由目标方向发起方传送;若I/0信号为“伪”,则表示数据由发起方向目标方传送。该信号也被用来区分选择和重选阶段。
5. MSG (Message,通信)信号
该信号由目标方驱动,表示总线处于信息传送的通信阶段。
6. REQ (Request,请求)信号
该信号由目标方驱动,表示有信息传输请求,请求一个 REQ/ACK 数据传送握手过程。
7. ACK (Acknowledge,应答)信号
该信号由发起方驱动,表示对REQ信号的应答。
8. ATN (Attention,提醒)信号
该信号由发起方驱动,指示一个提醒信息,表明发起方有一个消息要给目标方发送。
9. RST (Reset,重置)信号
该信号是“或态”信号,表示一个硬件重置状态,指示总线进入重新设置阶段,清除所有使用总线的 SCSI设备。
10. DB (DataBus,数据总线)信号
DB 信号有两种,分别是用于 8 位数据总线的 DB (7-0,P)和用于 16 位数据总线的DB (l5~O,P)。这些信号都用于传送信息的值,它们包括数据比特信号,加上奇偶检验比特信号。
由于在SCSI总线上挂有多个设备,一些控制信号可能同时被多个SCSI设备驱动。这些信号被称作“或态”信号。对于“或态”信号,SCSI设备不会主动将其驱动成“伪”,而是依赖总线终接器,在总线上的所有设备都没有驱动该信号时将其设置成“伪。”只要有 1个或多个设备驱动该信号,该信号就是“真”。与“或态”信号相对照的是“非或态”信号。对于“非或态”信号,SCSI设备可以将其驱动成“伪”。
3.6 SCSI 总线的使用阶段
根据对总线不同的使用,可以把SCSI总线状态划分成8个不同的阶段:空闲阶段,仲裁阶段,选择阶段,重选阶段,命令阶段,数据阶段,状态阶段和通信阶段。
其中命令阶段,数据阶段,状态阶段和通信阶段都设计信息在总线的传送,所以又称为:信息传送阶段。
除了空闲阶段外,其他阶段的总线都被SCSI设备占用。
3.6.1. 总线空闲阶段
总线空闲表明没有一个设备在使用 SCSI 总线,也表示在此状态下,SCSI 设备如果需要,可以使用总线。SCSI设备需要在总线上的 SEL信号和 BSY信号都是“伪”之后,才可以检测总线是否处于空闲状态。
作为例子,SCSI总线可能在下列情况下进入空闲状态:
1.RST信号被设置;
2.不成功的总线选择或重选;
3.目标设备解除连接;
4.目标设备命令完成。
一旦一个SCSI设备确定总线处于空闲阶段,它就可以申请总线仲裁,从而进入仲裁阶段。
3.6.2. 总线仲裁阶段
在 SCSI总线上的设备必须先获得总线连接权,然后才可以进行其他的操作。在默认条件下,看似挂在总线上的设备在逻辑上是与总线断开的,没有参与总线上的活动。SCSI设备只有在需要进行数据传输和设备状态报告时才会申请总线连接权。SCSI设备一旦得到了总线连接权,就将在发起方和目标方之间形成一个物理连接的通道,然后就可以进行数据传输。
一般情况下,总线的获取与对目标方的选择都由发起方完成。为了更加高效地使用总线,在某些情况下,例如在有较长时间的CPU处理等待或设备存取等待时,需要释放总线以供其他设备使用。在等待的相关任务完成后,再重新进行总线仲裁和连接权获取操作,以继续进行暂停的工作。因此,有时目标方也可以执行总线操作和连接权获取操作,准确地讲,是再获取操作。
SCSI总线上的设备的优先级是由它的地址即 SCSI ID 决定的。在窄 SCSI 中的 ID 范围是 0-7,对应的优先级是从 1 到 8。在宽 SCSI 中的ID范围是O~l5,其中对应 IDO~7的优先级是从9到 16递增,而对应 ID8~l5 的优先级是从 1 到 8 递增。在这里,我们用较大的数值表示较高的优先级,因此,ID7具有最高优先级。在窄 SCSI 中,ID 0具有最低优先级;在宽SCSI中,ID8具有最低优先级。
SCSI总线上的 ID数目是与 SCSI数据总线宽度一致的,因此,窄 SCSI有8个ID,宽 SCSI有 16个ID。在窄 SCSI 中的 8根数据线的编号是从0到 7,在宽 SCSI 中的 16根数据线的编号是从 0到 15。有趣的是,具有某个编号的数据线上的信号,还被用来表示具有对应号码ID 的 SCSI设备是否在执行选择或相关操作。例如当数据总线中的数据线DB (2)在某个特定的阶段被驱动成真时,就可以表示其ID为 2 的设备已经在总线上执行了选择或相关操作。
在SCSI域中,主机是存储设备的主要使用者,且对存储的响应要求较高, 因此通常主机的优先级最高,其分配的ID值也最大,在窄 SCSI 中是 ID 7,在宽 SCSI 中是IDl5。
总线仲裁就是在可能同时有多个设备请求的情况下,最终只给予其中的一个 SCSI设备总线控制权的过程。SCSI设备在检测到“总线空闲”并等待一个时延后即可以把总线置成BSY,并把与它的 SCSI ID对应的数据线信号置为“真”,开始总线仲裁申请。
在等待 1 个时延后,该SCSI设备需检测在数据总线上是否有更高优先级的 SCSI ID也为“真”。如果总线上确有更高优先级的设备在进行总线申请,则该 SCSI 设备不再置BSY和对应的数据线为“真”。放弃总线仲裁申请,直到下一次“总线空闲”;否则,该设备就获得了总线控制权,并由该设备把SEL信号置为“真”。同时,总线上的其他SCSI设备则检测到 SEL信号为“真”后,不再置BSY信号和对应的数据线为“真”,放弃总线仲裁申请。为了保证确实已经获得了总线控制权,该设备在置SEL信号为“真”后、传送其他信号前,需要有一定的时延。
在总线仲裁阶段结束时,总线上有BSY、SEL和与获得总线的 SCSI设备的 ID,其对应的数据线的信号为“真”。
3.6.3. 选择阶段
在选择阶段,得到总线使用权的SCSI设备在总线上选择目标设备,以便随后可以向该目标设各发送诸如读和写这样的命令。这个阶段主要是完成对具有特定SCSI ID的设备的选择,其相关协议的定义主要是在SCSI体系结构的互连层。需要注意的是,逻辑单元号LUN的寻址是逻辑单元通过SCSI传输层协议完成的,不在互连层。与LUN编址相关的协议在传输协议层描述。
赢得仲裁的SCSI设备在把BSY和SEL信号置成“真”,经过一小段时延后,即可进入选择阶段。作为发起方,赢得仲裁的SCSI设备不可以把1/0信号置成“真”。在此阶段,发起方需要把与自己的SCSI ID对应的数据线的信号和对应所要选择的目标设备的SCSI ID的数据线的信号置成“真”,经过一小段时延,再把BSY信号置成“伪”,然后等待目标方的响应。
例如,SCSI ID为6的主机把对应自己的ID的数据线DB(6)和对应目标设备的ID(=6)的数据线DB(0)置成“真”后,数据总线上信号值的状态将如下所示。
DS ( 0) DS (1) DS (2) DS (3 ) DS (4) DS (5) DS (6) DS (7)
1 0 0 0 0 0 1 0
此时,只有两个数据线的信号值是“真”。如果有多于两个的数据线为“真”,则目标方认为有误。目标方在SEL和对应它的ID的数据线的信号为“真”并且BSY和I/0信号为“伪”的情况下,就可以确定它自己已经被选为目标设备。此时,目标方设备应该重新把BSY信号置成“真”。发起方在检测到BSY为“真”的信号后,就把SEL信号置成“伪”。特别需要注意的是,在该阶段结束时,BSY信号是由目标方置位的。
3.6.4. 重选阶段
在 SCSI 目标设备忙于处理其内部事务 (通常是对于执行对存储数据的读或写操作)期间,它可以在等待操作 (比如把存储在设备中的数据读入缓冲区或把暂存在缓冲区的数据写入缓冲区)完成时释放总线供其他设备使用,并在操作完成后重新申请对总线的使用权。因此,重选阶段也发生在“总线仲裁阶段”之后。但与选择阶段不同,重选阶段由目标方启动,重新建立由发送方启动成功但被目标方挂断的连接。
在目标设备释放了总线之后,BSY和 SEL信号处于被置成“真”的状态。此时日标设备通过把I/0信号置成“真”使自己成为赢得对总线使用权的一方。在重选阶段,目标方也需要把与自已的 SCSI ID 对应的数据线的信号和对应发送方设备的 SCSI ID的数据线的信号置成“真”,经过一段短的时延,再把BSY信号置成“伪”,然后等待发起方的响应。
发起方在SEL、I/0和对应它的 ID 的数据线的信号为“真”并且BSY为“伪”的情况下,就可以确定它自己已经被重选。被重选的发起方可以通过查看数据总线来验证重迭的目标方的 SCSI ID。然后,发起方设各重新把BSY信号置成“真”。目标方在检测到BSY为“真”的信号后,它也执行把BSY驱动成“真”的操作,并把 SEL信号置成“伪”。
被重选的发起方在检测到 SEL信号为“伪”后,它就把BSY置成“伪”,而目标设备则继续把 BSY 设置成“真”,直到它放弃对总线的使用权为止。这样,在该阶段结束时,信号的状态与选择阶段一样,也是由目标方设置的BSY信号。
3.6.5. 信号传送阶段
命令阶段、数据阶段、状态阶段和通信阶段被组合在一起作为信息传送阶段,因为它们都被用来通过数据总线传送数据或控制信息。SCSI 使用 C/D、I/0 和 MSG信号区分不同的信息传送阶段以及对应的信息传输方向。目标方驱动这3个信号,控制从一个阶段到另一个阶段的转变。发起方可以通过把ATN信号置成“真”请求一个“通信出”阶段,而目标方可以通过释放MSG、C/D、I/0 和 BSY信号引入总线空闲阶段。信息传送阶段使用一个或多个REQ/ACK握手过程控制信息传送。每个REQ/ACK握手过程允许传送 1个或多个字节的信息。因为信息传送阶段一定是在选择阶段或重选阶段之后,所以不改变BSY和 SEL信号。事实上,在该阶段,BSY持续为“真”,SEL信号持续为“伪”。
表2-2 示出了 MSG、C/D和I/0信号值与阶段名及信息传输方向之间的关系。其中的“出”和“入”是相对子发送方设备而言的,且数据传输方向由I/0信号确定。
表 2-2 MSG、C/D和 1/0信号值与阶段名及信息传输方向之间的关系
MSG |
CID |
1/0 |
阶段 |
具体阶段 |
传输方向 |
|||
1 |
0 |
0 |
* (未用) |
|||||
1 |
0 |
1 |
* (末用) |
|||||
1 |
1 |
0 |
通信 |
通信出 |
从发送方到目标方 |
|||
1 |
1 |
1 |
通信 |
通信入 |
从目标方到发送方 |
|||
0 |
0 |
0 |
数据 |
数据出 |
从发送方到目标方 |
|||
0 |
0 |
1 |
数据 |
数据入 |
从目标方到发送方 |
|||
0 |
1 |
0 |
命令 |
从发送方到目标方 |
||||
0 |
1 |
1 |
状态 |
从目标方到发送方 |
注释:0=伪,1=真,*=保留未来定义
命令阶段允许目标方请求发起方传送命令信息。在命令阶段的 REQ/ACK 握手过程中,目标方把C/D信号置成“真”,把I/0信号和MSG信号置成“伪”。
数据阶段包括“数据入”阶段和“数据出”阶段。
(1)“数据入”阶段允许目标方请求把数据从目标方传送给发起方。在“数据入”阶段的 REQ/ACK 握手过程中,目标方把I/0信号置成“真”,把C/D信号和MSG信号置成“伪”。
(2)“数据出”阶段允许目标方请求把数据从发起方传送到目标方。在“数据出”阶段的 REQ/ACK 握手过程中,目标方把C/D信号、I/0信号和 MSG信号都置成“真”。
状态阶段允许目标方请求把状态信息从目标方传送给发起方。在状态阶段的REQ/ACK握手过程中,目标方把C/D信号和I/0信号置成“真”,把MSG信号置成“伪”。
通信阶段可以是“通信入”阶段或“通信出”阶段。无论是在“通信入”阶段,还是在“通信出”阶段,都可以传送多条消息。传送的第一个字节可以是单字节消息,也可以是多字节消息的首字节。在 1 个通信阶段可以传送多个多字节消息。
“通信入”阶段允许目标方请求把消息从目标方发送给发起方。在“通信入”阶段的 REQ/ACK握手过程中,目标方把C/D信号、I/0信号和 MSG信号都置成“真”。
“通信出”阶段允许目标方请求把消息从发起方传送到目标方。目标方在响应发起方建立的提醒条件时调用“通信出”阶段。在“通信出”阶段的 REQ/ACK 握手过程中,目标方把C/D信号和 MSG信号置成“真”,把I/0信号置成“伪”。
3.7 异步传输和同步传输
与传统网络的数据包传送方式不同,SCSI 基于REQ/ACK 信号控制数据传输的过程。 根据REQ和ACK信号控制与数据总线置位时间的差别,信息传输又可分为异步传输和同步传输两个列别。而且,无论传输的方向如何,信息的传输都是由REQ信号开始,并且REQ信号都是由目标方控制和发送的。
1. 异步信息传输
异步传输方式可用于数据阶段的数据传输,也可用于命令、状态和通信阶段的信息传输。首先,信息传输的方向是由 I/O信号决定的。如果 I/O信号为“真”,那么信息是由目标方向发起方传输。在此情况下,为了传送信息,目标方先把数据线 DB(7/15-0,P)信号置成对应想要传送的二进制数位序列的值,然后把REQ信号置成“真”。 发起方在检测到REQ为“真”时,读取数据总线的值,然后把ACK信号置成“真”。当目标方检测到ACK为“真”时,它就可以改变或取消放置在数据总线上的值,并把REQ置成“伪”。发起方在检测到REQ置成“伪”时把ACK也置成“伪”。当目标方检测到ACK为“伪”时,总线上就完成了一次数据传输,并可进行下一次数据传输。
在异步传输方式中,每个REQ/ACK握手过程传送 1个(对于窄 SCSI)或 2 个字节(对于宽 SCSI)的信息。特别需要注意的是,在此方式中,目标方在置 REQ 信号后,必须持续地把数据线 DB (7/l5~O,P)置成对应所要传送的二进制数位序列的值,直到它检测到ACK为真为止。
如果I/O信号为“伪”,那么信息是由发起方向目标方传输。在此情况下,目标方通过把REQ置成“真”来请求信息。发起方驱动 DB (7/l5~O,P)到它需要发送的二进制数位序列的值,然后把 ACK置成“真”。此后,继续把 DB (7/l5~O,P)信号置成这个二进制数位序列的值,直到 REQ 变成“伪”为止。目标方则是在检测到 ACK变成“真”时,读 DB (7/l5~O,P)的值,然后把 REQ 置成“伪”。发起方在检测到REQ变成“伪”时,它可以改变或取消放置在数据总线上的值,并把ACK置成“伪”。
此后,目标方可以通过把REQ置成“真”,继续请求信息。
2. 同步数据传输
同步数据传输只在数据阶段使用,并且是在目标方和发起方之间建立同步数据传输协定之后使用。
与异步传输中的规则相同,当 I/0 信号为“真”时,数据是由目标方向发起方传输。目标方先把数据放置到数据总线上,即置 DB (7/l5~O,P)对应的线路,然后把REQ置成“真”。在同步数据传输中,目标方在把REQ置成“真”后,需要把放置在DB (7/l5~O,P)上的二进制数位序列的值保持一个指定长度的时间,但不必维持到对ACK信号变“真”的接收。这是与异步传输不同的一个地方。在指定长度的时间期满后,目标方就可以把 REQ 置成“伪”,并且可以改变或取消放置在数据总线上的值,然后准备发送下一个数据。发起方在检测到REQ变“真”之后一个指定长度的时间内读DB (7/l5~O,P)上的值,然后把ACK置成“真”作为对目标方的响应。
与异步传输一样,在同步数据传输中,发起方也在接收到一个REQ并读取了数据总线上的值之后就发送一个ACK信号。但与异步传输不同的是,目标方在接收到对一个数据的ACK之前可以发送多个REQ信号。SCSI为同步数据传输的REQ/ACK握手过程定义了一个称作REQ/ACK饱和值的参数,它表示在接收到ACK信号前可以发送的最大REQ信号数。如果发送的REQ数日多于接收到的ACK数目,并达到了定义的REQ/ACK饱和值,那么目标方暂停发送REQ信号和数据,直到接收到下一个ACK为止。这在原理上与传统网络中的流控制类似。
当 I/O信号为“伪”时,数据是由发起方向目标方传输。发起方每次接收到一个REQ信号就发送一次数据。目标方先把REQ置成“真”。发起方检测到REQ变“真”后把要发送的数据放置到数据总线上,即置DB (7/l5~O,P)对应的线路,然后把ACK置成“真”。接着发送方需要在一个指定长度的时间内保持在总线上放置的数据不变, 并继续把ACK置成“真”。在指定的时间期满后,发起方可以把ACK置成“伪”,并且可以改变或取消放置在数据总线上的值。目标方在检测到ACK信号变“真”后,在指定的ACK保持为“真”的时间内读取数据总线上的数据,并把REQ置成“伪”。
此后,目标方可以通过把REQ再置成“真”继续请求信息。
3.8 SCSI 命令描述块
在互连层完成 SCSI设备对总线的连接,以及发送方和目标方的选择的基础上,传输层协议执行实际的数据传输。传输层提供了两类服务,一是命令的执行和确认;二是数据的传送。命令的执行是在总线进入命令阶段后,发起方通过命令描述块(command description block,CDB)向目标方发送具体的命令。命令的确认是在总线进入通信 (Message)阶段后,发起方接收由目标方发送的命令执行确认信息。数据的传送则是在数据阶段 (数据出或数据入)进行的。传输协议的运行过程包括发送命令、传输数据和对命令执行的确认。SCSI基础命令规范 SPC (SCSI Primary Commands,SCSI基础命令)定义了 CDB 的标准。
除了基本命令外,SPC还定义了所有类型的 SCSI 目标方设各都可以使用的管理参数,如诊断参数和日志参数等。
发起方对存储设备的实际操作是通过向目标方发送一个命令描述块来完成的。在一些情况下,在一个命令描述块之后可能还有一些参数要传给目标方,按照具体的协定,这些更多的参数是在命令描述块后的“数据出”阶段发送的。命令描述块有定长和不定长两种格式,而定长格式的命令描述块又有 6、10、12或 16字节不同的长度规定。
命令描述块由编号从0~5 的 6个字节组成。下面介绍其中各个段的内容。
1. 操作码
操作码是所有命令描述块都有的,它总是被放在命令描述块的开头一个字节。正如其名字所言,操作码定义CDB 的具体操作。8 比特在理论上共有256个可能的操作码。实际上其中有一些是保留码,日前尚未定义。操作码的 8 个二进制位又分为两部分:5-7位是组代码,指示该命令具体属于哪个命令组,它决定 CDB 的长度,如“000”为组“0”,表示6个字节的CDB命令组,0-4位则是具体的命令代码。
2. 混杂CDB信息
该参数表示与具体的CDB相关的信息,其中一个例子是表示逻辑设备号,寻址在SCSI 目标设备中的一个逻辑单元。对应一个SCSI ID 的设备可以有多个逻辑单元,所以逻辑单元扩展了 SCSI总线可访问的设备数目,使得目标方设各上可以有多个可被访问的设备而只占用一个有效的 SCSI ID。对一个逻辑单元的实际访问是通过该逻辑单元的一个特定的编号,即逻辑单元号实现的。
3. 逻辑块地址
该地址是逻辑单元 (比如磁盘)中的起始操作块的位置。在 6 字节的CDB 中,有21 位的逻辑块地址。SCSI把逻辑单元、卷或分区抽象成块的数组,每一块都有一个逻辑地址,编号从 0 开始。对 SCSI 存储设备的每一次读/写操作都是针对一组连续的逻辑块进行的,因而需要指出起始块的逻辑地址。
4. 传送长度
该长度表示命令所请求的传送量,通常是块数。在有些类别的 CDB 中也可能是字节数。0表示不需要传送数据。
5. 参数表长度
有些命令还需要更多的参数,这些参数由客户提供,定义在“数据出”缓冲区中。参数表长度就表示需要传送到存储设备的这类参数的长度,0表示不需要传递参数。
6. 分配长度
分配长度表示应用客户为“数据入”缓冲区分配的最大长度,根据具体的CDB类别,可能是字节数,也可能是块数。应用客户通常使用该“数据入”缓冲区接收特殊信息,如日志数据、诊断数据等。如果传送的信息量超过了分配长度表示的最大值,则相关设备不应再传,并使用状态阶段返回特定的状态信息。
7. 控制码
它是所有 CDB 格式的最后一个字节。在其中有一些特殊的域,如已经定义的一个NACA位。在一些情况下,一个命令的执行会以“检查条件 (Check Condition)”状态中止,它表明在命令执行过程中出现了错误或异常。 有些命令执行的错误或异常不会影响其他命令的执行,也不需要作善后的恢复处理,而另一些命令执行的错误或异常则可能导致命令组中的其他命令被异常中止,需要专门的命令对其做善后处理,并要求存储设各在完成善后处理工作之前不再处理该用户的其他命令。为了区分这两种不同的情况,也为了让应用客户能够事先声明哪些命令执行的错误或异常需要善后处理,SCSI允许应用客户在CDB 的控制码中设置NACA位,请求存储设备在命令执行以“检查条件”状态中止时建立“自动跟随”条件 (Condition),从而允许应用客户在随后的善后处理命令中把新 (New)任务的属性设置成自动跟随 (Auto ContingentAllegiance,ACA)。
3.9 SCSI 的读操作和写操作过程
1. SCSI的读操作过程
如果计算机要从存储设备上读取文件或数据,那么无论数据的大小如何,都至少要经历一个SCSI的读操作过程。当然,操作系统需首先将用户的读取操作通过 SCSI I/0的应用程序编程接口 (Application Programming Interface,API)转化为 SCSI的读操作,并在操作完成后通过相应的API返回响应的值。
在SCSI域内,这个操作在传输层被简单地描述成 5个主要过程:
(1)发起方通过CDB发送SCSI的读命令。
(2)目标方接收到该命令,通过设备管理器在指定的逻辑单元中执行该命令请求的操作。
(3)目标方以字节为单位向发起方传送数据。
(4)在数据传输完毕后,目标方向发起方发送命令完成的报告。
(5)发起方接收到命令完成的响应。
当然,这些过程是建立在 SCSI 互连层的基础上的。在第一个过程之前,SCSI 总线由空闲阶段进入总线仲裁和选择阶段,完成发起方对总线使用权的获得以及对目标方的选择和寻址。
在第一个过程中,目标方发送REQ信号,请求信息传输,控制总线进入信息传送的命令阶段。目标方通过发送方传送的 CDB获取“读”命令。在其后的第 2 个和第 3个过程中,目标方从它控制的外围设备中读取数据并发送到发起方。如目标方准备数据需要较长的时间,则可能有多个总线释放、进入空闲和重选阶段的轮回。目标方在每次完成数据传送后,都控制总线进入状态阶段并返回一个状态信息。为进一步表示读命令的全部完成,在第四个过程中,总线进入信息传送的通信阶段,目标方发送“命令完成”信息,并可释放 SCSI 总线的 BSY信号。在第五个过程中,发起方接收到日标方命令完成的响应,总线可恢复到空闲阶段。
2. SCSI的写操作过程
SCSI的写操作过程与读操作过程类似,但数据传送的方向不同,它把数据从发送方向目标方传送。在发送方系统中有对文件做写操作的用户请求时,它先通过文件系统查找该文件在存储设备 (如磁盘)上的逻辑块地址 (Logical BlockAddress,LBA),接着文件系统把该LBA连同其他一些参数,如数据的指针、数据的长度以及逻辑单元号等传递给SCSI 的 API,并指示一 个写操作。例如写 6000字节到 LUNO 的逻辑块地址OOOl234AB。SCSI的API则具体发送一个写命令给LUNO,并将数据以存储设备认可的方式分批或一次性地传递到 LUNO,直到数据全部传输完毕。之后,SCSI 的 API返回,并指示任务完成。然后,文件系统通知应用程序任务完成。至此,一个文件的写操作完成。
当然,在数据写操作中,仍然需要具体运行SCSI的各个阶段,并需要发送SCSI信号以及SCSI命令,如写命令等。这些方面都与上面描述的读操作类似,此处不再赘述。
从上面的介绍可以看出,一个简单的数据读或写操作会涉及一系列的过程。实际上,在这些过程中,除了有应用程序 (如字处理软件、数据库等)为用户提供的直接操作界面和操作系统给应用程序提供的通用的系统功能外,还有文件系统、SCSIAPI、SCSI设备命令、SCSI驱动程序、总线和存储设备等多种软硬件的参与。