存储设备SCSI接口标准
Linux开发架构之路 2024-06-21

SCSI协议介绍

SCSI,全称Small Computer System Interface,即小型计算机接口,是一种用于连接计算机及其外围IO设备(如磁盘、光驱等)的接口标准,目前最大部分的应用是在存储设备上。SCSI协议定义了统一的信息交互模型和必要的命令集,用于计算机与不同设备间进行数据通信;同时SCSI协议不与特定的传输介质绑定,因此可以在多种传输介质上实现,如基于光纤的FCP链路协议、基于IP网络的ISCSI协议以及SAS链路协议等。

SCSI协议发展历程

SCSI协议的发展可划分为SCSI-1/SCSI-2/SCSI-3三个阶段,最新的为SCSI-3,也是目前应用最广泛的SCSI版本。下表展示了SCSI协议的整体发展历程:


早期SCSI协议都是采用的并行总线技术,随着串行高速总线技术的加入,并行SCSI技术也在后来被SAS总线技术被替代。

SCSI协议标准

时至今日,SCSI协议已经发展成了一个庞大的协议体系,并且已成为了存储企业级应用领域事实上的协议标准。由于SCSI协议并不局限于某一特定的链路传输技术,各种支持SCSI协议的链路实现标准被加入了SCSI协议当中,如今的SCSI协议是一个大量标准的集和。整体来说,SCSI协议标准文档被划分成了如下的多个部分:


这些标准文档可以大致可以分为三类:体系结构文档、设备实现文档和链路实现文档。

  • 体系结构文档:包括SAM和SPC文档,其中SAM定义了SCSI协议的体系结构模型、SCSI标准集合的功能划分以及SCSI实现标准的通用要求等;SPC为所有SCSI设备类型定义模型的实施标准,此标准指定了所有SCSI设备通用的所需命令和行为,并规定了SCSI启动器设备在向任何SCSI目标设备发送命令时要遵循的要求;

  • 设备实现文档:定义了同介质无关实现该设备必要的命令集,例如实现块设备(如硬盘)的SBC命令集,实现流设备(如磁带)的SSC命令集等;

  • 链路实现文档:描述了SCSI协议在各种链路协议的实现细节,这些都在单独的协议文档里面定义,例如基于光纤的FC链路协议、基于SAS的链路协议以及基于IP链路的iSCSI协议。

SCSI命令集文档

SCSI命令集文档由SPC(SCSI Primary Commands)、SBC(SCSI Block Commands)、ZBC(Zoned Block Commands)、SES(Enclosure Services Commands)等构成,其中,最常使用的是SPC和SBC文档:

  • SPC文档定义了适用于所有SCSI设备的通用命令集,如INQUERY、TUR等命令以及Sense信息格式;

  • SBC文档中定义了适用于块设备的命令集,如READ、WRITE、VERIFY等。

通常SCSI文档推荐阅读的顺序为SAM、SPC以及特定于设备类型的命令集文档。

SCSI体系结构

SCSI体系结构主要包含了SCSI通信模型、命令模型、任务管理等方面的内容。

SCSI基本术语

SCSI协议定义了一系列概念,这里针对一些基本术语进行简单的说明。


  • Initiator:启动器,可以发送SCSI命令并接收响应的设备;

  • Target:目标器,充当SCSI命令接收器的设备;

  • LUN:逻辑单元,是SCSI目标器中充当数据源或目的地的名字空间资源,一个目标器可以包含多个LUN,每个LUN可以具有不同的属性;

  • NEXUS:NEXUS用于描述启动器端口和目标器端口之间的连接。

SCSI client-server模型

SCSI的Initiator与Target共同构成了一个典型的C/S模型,每个指令都是“请求/应答”这样的方式来实现。


SCSI client-server模型中包含两个重要的角色:

  • SCSI启动器:SCSI Initiator Device,SCSI是一个C/S架构,其中Client端成为启动器,负责向SCSI目标器发送请求指令,如SAS主机适配器;

  • SCSI目标器:SCSI Target Device,作为Server端,接收来自SCSI启动器的指令并解析处理,如SAS硬盘。

完整的SCSI协议的体系结构模型在SAM文档中进行描述,可以查阅以对SCSI协议有更多的了解。

SCSI命令模型

SCSI协议对链路传输没有进行严格的限制,但约束了SCSI的命令模型。协议允许使用SAS、FC以及以太网等不同的链路实现,但对所有的SCSI传输层实现而言,都必须遵循统一的SCSI命令模型。SCSI命令模型约束了SCSI命令执行过程、命令请求格式、命令响应状态以及错误描述等内容。 


命令描述块(CDB)

一个完整的SCSI请求由CDB、数据、命令属性信息构成,其中,CDB描述了该SCSI命令的具体细节,包括命令操作类型(read/write/inquiry等)、数据的处理方式等信息。最早的SCSI-1支持的是6个字节的指令,后来慢慢演变成了10字节,12字节,16字节,后续还有应用扩展为32字节的CDB。这里以16字节长度CDB为例,它的通用格式定义如下:


关于其它长度的CDB格式定义,可以参考《SCSI Primary Commands》(SPC)手册。

通用CDB字段

对于不同格式的CDB,都会包含一些通用的字段,对于这些通用的CDB字段描述如下:

  • Operation Code:定义在CDB的第一个字节,描述命令请求类型,详细的命令描述可以参考SPC以及设备相关的命令手册中;

  • Service action:与Operation Code配合执行特定的操作;

  • Logical block address:简称LBA,描述数据读取或者写入的LUN地址;

  • Transfer length:描述数据传输长度,使用扇区作为基本单位;

  • Parameter list length:用于描述从Data-out缓冲区发送的字节数,可以为0;

  • Allocation length:用于描述Data-in缓冲区已分配的最大字节数。

命令响应状态

当目标器设备完成命令处理后,会返回状态响应给启动器,用于指示命令的完成状态:完成或者异常。SCSI协议约定使用特定的状态码(Status code)和状态限定符(Status qualifier)来告知应用命令的处理结果。

Status code

SCSI协议定义的状态码如下表所示:


Status qualifier

Status qualifier与配合Status code,提供更多返回该状态的原因的信息。Status qualifier格式定义如下:

日常维护过程中,Status code使用的比较多,Status qualifier通常不太关注,需要了解的话可以查看SAM手册。

Sense Data

当命令以CHECK_CONDITION状态终止时,目标器设备会返回Sense Data,用于告知上层应用命令终止的原因,应用会根据Sense data确定如何进一步处理。Sense data主要通过Sense key、Asc(additional sense code)以及Ascq(additional sense code qualifier)来描述命令执行的异常信息,其中:

  • Sense key描述了主要错误信息的类别;

  • Asc和Ascq在Sense key的基础上进一步说明了具体的错误原因。

Sense key信息

Sense key是对错误信息做的一个分类,协议定义的Sense Key及其描述如下:


声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 【立即预约】Keysight直播:搞懂介电常数那些事儿


  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
  • 深谈嵌入式系统,嵌入式系统是如何组成的?

    嵌入式系统在生活中有诸多应用,大家对于嵌入式系统或多或少有所耳闻。在前两篇文章中,小编对嵌入式系统进行过详细介绍。为继续增进大家对嵌入式系统的认识,本文将对嵌入式系统的组成加以说明。如果你对嵌入式系...

    06-27
  • 嵌入式系统秘籍共享,最全嵌入式系统解析

    嵌入式系统的应用十分广泛,因此越来越多的人学习嵌入式系统。由此,在学习嵌入式系统之前,我们应当对嵌入式系统具备一些认识。所以在本文余下部分,小编将对嵌入式系统进行全面解析。如果你对嵌入式系统具有兴趣...

    06-27
  • 51单片机超声波测距程序详解

    51单片机超声波测距程序详解 超声波四通道测距:超声波测距实现分为三大块: 其一是12864带字库的液晶驱动程序: 代码如下: /////////////////12864驱动程序/////////////////////////// //1写数据 void WriteDat...

    06-25
  • 51系列单片机的引脚图

    51系列单片机的引脚图 端子介绍 l P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子)。 l P1.0~P1.7 P1口8位双向口线(在引脚的1~8号端子)。 l P2.0~P2.7 P2口8位双向口线(在引脚的21~28号端子)。 l P3.0~P3.7 P2口8...

    06-25
  • 51单片机串口通信需要加超时中断吗?

    接收数据时,超过一定时间就算出错. 这个超时的时间是单片机自己算出的吗?超时的时间是由编程序的人定的,他定多长就多长从一段程序开始 实现电脑向 单片机发送一些数据,单片机返回Iget +数据 #include #define u...

    06-25
  • 51单片机电机pid控制系统程序

    51单片机电机pid控制系统程序 本程序来源网上,小编进行了简单修改,还未验证。 /************************* 应用背景:直流电机的额定功率12V,额定转速3000rpm,光码盘12孔, 晶振为12MHz,定时/计数器T0检测转...

    06-25
  • 51单片机指令集设计实例

    当你编写完一个程序后,通过软件调试,你可以看到程序的指令集,从指令集你就能知道单片机内部是如何工作的,比如数据存取的寄存器与地址,下面是电工之家找的一篇指令集,讲的蛮好的。 一、数据传送类指令(7种助...

    06-25
  • 51单片机定时器工作原理及用法

    TMOD : 控制定时器的工作方式。8个bit,高四位 bit 控制 T1,、低四位 bit 控制 T0。因为定时器有4种工作方式;TMOD = 0x00(工作方式0),TMOD = 0x01(工作方式0),TMOD = 0x02(工作方式2),TMOD = 0x03(工作方式3)。...

    06-25
  • 51单片机指令系统寻址方式

    指令给出参与运算的数据方式称为寻址方式。换句话说,寻址方式就是寻找确定参与操作的数的真正地址。 在MCS-51系列单片机的指令系统中寻址方式共有7种,立即寻址方式,mcs-51单片机的一种寻址方式,操作数就写在指...

    06-25
  • 51单片机学习单片机之路总结

    学习单片机有一学期了,现在也由51转到STM32了。一直想对51的学习做一个总结。也希望对别人有一些启发。也给后学者提供一些建议。当然本文是我对自己学习过程的总结,若有不对的地方,还请高手指出。 我想,再看本...

    06-25
  • 入手STM32单片机的知识点总结

    从STM32新建工程、编译下载程序出发,让新手由浅入深,尽享STM32标准库开发的乐趣

    06-23
  • 单片机定时器之改良版:时间轮定时器

    前段时间把自己以前用的单片机定时器整理出来,我称之为简单定时器,这种简单定时器比较适合定时器使用量少的程序中,如果定时器数量要求多,精度要求高,效率就会有问题,为此,俺就实现了一个时间轮定时器,简单测...

    06-23
下载排行榜
更多
评测报告
更多
EE直播间
更多
广告