SCSI协议基础概念
SCSI设备的连接类似树形的分层结构,从PCIE总线遍历,可以找到所有的SCSI设备,从上到下的层次为:PCIE->HOST->channel->target->lun。
Scsi架构中主机上的scsi接口卡称为initiator,与其相连接的scsi 磁盘等设备称为target,在逻辑上,initiator和target之间通信的工作模式,与两个网络设备之间的模式相似,他们之间采用client-server的“请求-响应”模式。
SPC:SCSI Primary Command,所有SCSI设备都需要支持的命令;项目实现SPC-5
SBC:SCSI Block Command,块设备需要支持的命令;SBC-4
这里的client是initiator端的驱动,server是target端的逻辑单元 logic unit。与网络设备相似,scsi设备对信息的处理也是分层进行的,最上面的是应用层,发出的是scsi命令,最下面的是物理层,发出的是光或电信号,中间通过层层封装,保证传输的可靠性,并对上层屏蔽底层的差异。也就是说,client可以与server通信,而不需要知道底层的物理互连或SCSI传输协议。
SCSI 实现了一种客户机/服务器风格的通信架构。发起者向目标设备发送命令请求。该目标处理此请求并向发起者返回响应。发起者可以是托管计算机中的一个 SCSI 设备,而 SCSI 目标则可以是一个磁盘、光盘和磁带设备或特殊设备(比如箱体设备)。
LUN:一个Target设备中可能有多个Logical Unit,每个都由Logical Unit Number(LUN)标识。
Nexus:来自拉丁文,意思是纽带(tie or bind),描述事物之间的连接关系。在SCSI系统中,表示设备之间的关系,如用于Target重连Initiator、Initiator获取是哪个Target发送来的事物。例如:
a) I_T Nexus:Initiator和Target之间的连接;
b) I_T_L Nexus:Initiator和Target及内部的LU之间的连接;
c) I_T_L_Q Nexus:带有权重的I_T_L之间的连接。
当应用client发送命令到设备服务端时,作为数据传输的开始[徐1] 。
Server端接受任务,通过发送或接收数据作为响应,然后返回这个事务的状态值。服务端包含任务调度器,处理加入队列后的任务集。SCSI为客户端定义了一套任务管理功能(Task Management Function)来管理队列。例如“Abort Current Task”,客户端可以产生一个任务相关的请求发给服务端的任务管理功能,然后从Target端获取一个响应,如下图所示:
要求每个LUN都支持4个SPC命令,如下所示。例如,INQUIRY命令返回Target设备信息,包括该设备支持的命令集。
LU服务完一个命令后,将返回一个Status Code(状态码)。最常见的状态码如下表所示。如果状态码是02h(CHECK CONDITION),同时将返回Sense Data进一步解释问题是什么。
完整的Sense Key参见SPC标准,这里列出常见的Key,如下图所示:
1.1. CDB:Command Descriptor Block
根据SCSI定义,一共有4个命令组:
(1) Non-Data command:如TEST UNIT READY命令。
(2) Write command:如写数据到硬盘,因为从Initiator角度看,写数据命令也称为Data Out命令。
(3) Read command:如读磁盘命令,读命令也称为Data In命令。
(4) Bi-directional command:该命令中既有数据发送也有接收。但是不少操作系统不支持该命令,但是该命令对于支持RAID实现是有意义的,例如:Initiator可能发送数据,硬盘(drive)利用已存在的数据进行计算并返回结果。
逻辑单元验证保留的CDB字段,并且在CDB保留字段内收到不为零的数据,则逻辑单元应当以CHECK CONDITION状态终止命令,并且将sense key设置为ILLEGAL REQUEST,并且将其设置为CDB中的INVALID FIELD IN。
逻辑单元在OPERATION CODE字段以外的字段中接收到保留的CDB码值,则该逻辑单元应以CHECK CONDITION状态终止命令,将sense key设置为ILLEGAL REQUEST,并附加sense code设置为CDB中的INVALID FIELD IN。
1.1.1. CDB用例
命令通过向设备server端发送CDB来进行通信。对于几个个命令,CDB在Data-Out缓冲区[徐2] 中伴随着参数列表。详见指定命令的详细信息。
如果逻辑单元验证保留的CDB字段并且保留字段内容不为0,则逻辑单元应该以CHECK CONDITION状态终止,sense key设置为ILLEGAL REQUEST,sense code设置为INVALID FIELD IN CDB。
如果逻辑单元在OP CODE字段以外的其他字段中接收到保留的CDB码。则逻辑单元以CHECK CONDITION状态终止,sense key设置为ILLEGAL REQUEST,sense code设置为INVALID FIELD IN CDB。
定长/变长CDB见下面的相关描述,如果设备server端收到的CDB包含无效的或者不支持的OP CODE则,则逻辑单元以CHECK CONDITION状态终止,sense key设置为ILLEGAL REQUEST,sense code设置为INVALID COMMAND OPERATION CODE。
对于所有的命令,如果CDB的参数无效,则设备server端应终止并不改变媒介。
1.1.2. 定长CDB
OPERATION CODE最为第一1 byte,CONTROL Byte作为最后1 byte。
定长6-byte、10-byte、12-byte、16-byte如下
(1)6 byte命令格式CDB
(2)10 byte命令格式CDB
(3)12 byte令格式CDB
(4)16字节命令格式CDB,长LBA
1.1.3. 变长CDB
变长CDB的第1 byte 应为OPERATION CODE :7Fh,第1 byte为CONTROL byte。
ADDITIONAL CDB LENGTH (n–7):表示额外的CDB字节长度,必须为4的倍数。如果传输与此长度不符,则该命令应以CHECK CONDITION状态截止,且sense key设置为ILLEGAL REQUEST,附加sense code设置为INVALID FIELD IN CDB
[徐3]
1.2. CDB格式结构说明
1.2.1. OPERATION CODE
CDB第1个byte为 operation code(OP code),用于标识CDB的请求操作。某些operation code需要基于server action码来标识对应的CDB请求。Operation code 数据格式,包括group code和command code如下表格。Group code: 3-bit标识8组command code。Command code: 5-bit 提供32个cmd code在每个group内。
5~7bit:0表示6字节长命令。1/2表示10字节命令。5组表示12个字节命令。4表示16个字节命令。
1.2.2. SERVICE ACITON
除6-byte外数据格式外,CDB都提供一个Service Action字段,与operation code字段配合执行特定操作。在CDB数据格式中定义了Server Action字段,但仅在包含了该描述中使用,当CDB中Server action没有被定义试。按照CDB格式指定的方式使用。
1.2.3. LOGICAL BLOCK ADDRESS
逻辑区块地址:逻辑单元卷或分区内的逻辑块地址连续地从0块开始直到该逻辑单元的最后一个逻辑块。
一个6-byte的CDB可能包含一个21bit的LBA字段。10-byte和12-byte的CDB包含32 bit LBA字段。16 byte 的 CDB具有两种格式:一种允许32bit LBA字段,另一种允许64bit LBA字段。附加参数数据中的逻辑块地址字段的长度为每次出现指定。
1.2.4. TRANSFER LENGTH
Transfer Length字段要传输的数据量,通常以块为单位,一些描述中定义为发送请求的字节数。最多运行一个命令传输256个块256个字节的数据,多字节的Transfer Length字段标中,长度为零指定为无数据传输。
1.2.5. PRAMETER LIST LENGTH
参数列表长度:用于从Data-out缓冲区发送的字节数。在CDB中用户发送到server设备的参数(如模式、诊断、日志参数)。参数列表参数为0,为不传输任何数据。
1.2.6. ALLOCATION LENGTH[x4]
分配长度:表示应用client端在已经申请的Data-in缓冲区中分配的最大字节数。分配长度为0表示没有任何数据传输。当分配长度的字节或者所有有效数据(以较小者为准)已经传输时候,设备的server端需要终止传输到数据输入缓冲区。Allocation Length用于限制返回给应用的client端可变数据的的最大长度。如果传输到Data-in缓冲区的信息包括一些或者全部字段,这些字段内容不允许更改以反映由于分配长度不足而导致的阶段,除非手册另有说明。
如果要传输的数据信息超过分配长度的最大值,则设备的server端将不传输任何数据,命令会以CHECK CONDITION状态结束,sense key被置位 ILLEGAL REQUEST。Sense code被置为INVALID FIELD.
1.2.7. CONTROL
控制字对所有命令具有相同的定义。所有的CDB都包含一个控制字节,控制字节的定义如上表格表示。所有的SCSI协议标准都应该定义NACA位所需的功能。
NACA(Normal ACA)bit:
指定当状态以CHECK CONDITION回复是否建立偶然事件自动通信。用于指示LU是否进行auto contingent allegiance (ACA),ACA是在命令执行过程中万一发生错误时LU所采取的一种措施,如果ACA位没有置1,那么只要下一个命令是从同一个client发出的,该错误状态就被清除,如果ACA为被置1,就会保持这种错误状态,让引起错误的启动器通过REQUEST SENSE命令来获取检测数据。在ACA状态下所接受的第一个命令将删除检测数据并结束ACA状态。
1.2.8. GRUOPING FUNCTION
分组函数是收集与命令相关联的属性信息的函数(关于具有相同组值的命令被收集到指定的组中)
1.2.9. SENSE DATA
返回错误的状态给应用client端或者应答REQUST SENSE命令。
Sense Data的格式描述见手册。
SCSI命令
2.1. TEST UNIT READY
查询硬盘状态是否准备好。
如果逻辑单元能够接收一个恰当的访问命令,则不返回CHECK CONDITION状态,应返回GOOD状态。如果逻辑单元将设置为ready但是无法置为可操作状态或者应用client端正处于执行某命令的状态,这个命令需要以CHECK CONDITION状态结束,sense key置为NOT READY。(回复数据的格式)[徐5]
OP code: 0x00H
2.2. INQUIRY
查询设备信息。Inquiry命令发送到应用client端用来请求有关逻辑单元和SCSI目标设备信息。
OP code: 0x12h
EVPD(Enable Vital Product Data)bit:标志位表示设备server端返回一个重要的产品数据,而不是标准查询。Page Code字段表示返回的是哪个重要的产品数据[徐6] 。
0b:设备server端返回标准Inquiry数据。如果Page Code未设置为0且EVPD位为0,则该命令以CHECK CONDITION状态终止,sense key置为ILLEGAL REQUEST,附加sensen code置为INVALID FIELD。
1b:Page Code空间指定设备服务端返回产品重要信息的页信息。
CMDDT(Command Support Date):
T10委员会宣布此位作废,某些产品上可能还有实现,模拟平台不对此位进行处理。
2.3. ALLOCATION LENGTH:分配长度[徐7]
(1)如果EVPD为0,则分配长度至少为5,以使参数数据中的ADDITIONAL LENGTH空间返回。如果EVPD为1,则分配长度至少为4,以使参数数据中的PAGE LENGTH空间返回。
(2)如果响应错误的逻辑单元的Inquiry命令,SCSI目标设备应返回如表 定义的外设限定符。查询设备命令尽在无能返回Inquiry请求的数据时,返回CHECK CONDITION状态。
(3)从具有等待关注的条件的端口接收到Inquiry命令,设备server端执行Inquiry命令,不应清除设备关注的条件。
(4)即使设备server端还没有准备好接受其他的命令,Inquiry数据也需要返回。标准Inquiry数据应可以用,而不会引起任何媒介访问的延迟,如果设备server端媒介上存储了部分标准Inquiry或者VPD数据,可能会在返回ASCII码中的空格(20H)控在其他空间中返回0字段,直到可从媒介收获得数据。
(5)当SCSI设备及其逻辑单元执行初始化序列时,Inquiry数据可能会被更改。
(6)任何导致Inquiry数据的改变,则设备server端应与每个I_T关联的启动端口建立单元关注条件。并将sense code置为INQUIRY DATA HAS CHANGED。
(7)设备硬重置或开机后,应用client端可以使用Inquiry命令来确定系统配置的设备类型。
2.3.1. 标准Inquiry数据结构
标准Inquiry数据结构至少包含36字节
BitByte
7
6
5
4
3
2
1
0
0
PERIPHERAL QUALIFIER
PERIPHERAL DEVICE TYPE
1
RMB
Reserved
2
VERSION
3
Obsolete
Obsolete
NORMACA
HISUP
RESPONSE DATA FORMAT
4
ADDITIONAL LENGTH (n-4)
5
SCCS
ACC
TPGS
3PC
Reserved
PROTECT
6
BQUE
ENCSERV
VS
MULTIP
MCHNGR
Obsolete
Obsolete
ADDR16a
7
Obsolete
Obsolete
WBUS16a
SYNCa
LINKED
Obsolete
CMDQUE
VS
8
(MSB)
T10 VENDOR IDENTIFICATION
(LSB)
15
16
(MSB)
PRODUCT IDENTIFICATION
(LSB)
31
32
(MSB)
PRODUCT REVISION LEVEL
(LSB)
35
36
Vendor specific
55
56
Reserved
CLOCKINGa
QASa
IUSa
57
Reserved
58
(MSB)
VERSION DESCRIPTOR 1
59
(LSB)
.
.
.
72
(MSB)
VERSION DESCRIPTOR 8
73
(LSB)
74
Reserved
95
Vendor specific parameters
96
Vendor specific
n
PERIPHERAL QUALIFIER:外围设备限定符,指出设备是否和查询的逻辑单元相连接。
000b:标识具有指定的DeviceType的外围设备已和逻辑单元建立了连接。如果设备server端不能确定是否和外围设备是否连接,也可以使用这个限定符值。此值并不表示连接到逻辑单元的外围设备已经准备就绪。
001b:标识具有指定的DeviceType的外围设备没有和逻辑单元建立连接。设备server端在逻辑单元上具有支持该DeviceType的外围设备的能力。
010b:保留
011b:设备Server端在逻辑单元上不具有支持外设的能力。对于此限定符,DeviceType应配置为1FH。其他的DeviceType类型对于该限定符保留。
100b~111B:厂商专用
PERIPHERAL DEVICE TYPE:外围设备类型,SCSI的类型码[徐8] 。
00h:直接存储设备(磁盘驱动器)
01h:顺序存储设备(磁盘驱动器)
02h:打印设备
03h:处理器设备
04h:一次写入设备
05h:CD-ROM设备
06h:扫描仪设备
07h:光存储设备
08h:介质转换设备
…
1Fh:未知设备类型
RMB(Removable Media)bit:可移动媒介位[x9]
0b:表示不支持可移动
1b:表示可以移动媒介
VERSION field:
表示实现SPC实现的版本
06h:SPC-4
07h:SPC-5
NORMACA(Normal ACA Supported):
0b:表示设备server端不支持NACA为1,和ACA任务属性
1b:表示设备server端支持CDB中NACA为1,和ACA任务属性
HISUP(Hierarchical Support)bit
0b:表示SCSI目标设备部不使用分层寻址模式将LUN(逻辑单元号)分配给逻辑单元。
1b:表示SCSI目标设备使用分层寻址模式将LUN分配给逻辑单元。
RESPONSE DATA FORMAT field:
该字段值为2时候表示数据采用手册中定义的格式。小于2时表示格式无效。大于2表示
保留。
ADDITIONAL LENGTH field:
附加数据长度,表示在标准查询数据头后面跟随着的多少数据字节长度是可以使用的。
SCCS(SCC Supported)bit:
0b:表示不支持SCSI目标设备支持嵌入式存储控制器。
1b:表示支持SCSI目标设备支持嵌入式存储控制器。
ACC(ACCESS Control Coordinator)bit:
0b:表示SCSI目标设备没有逻辑单元寻址的访问控制协调器。如果SCSI目标设备可以通过逻辑单元进行寻址儿不是通过ACCESS CONTROLS,0逻辑单元号的ACC设置为1。
1b:表示SCSI目标设备包含可通过此逻辑单元寻址的访问控制协调器。
TPGS(Target Port Group Support)field:
目标端口组支持TPGS字段表示支持逻辑单元不对称访问。
00b:SCSI目标设备不支持不对称逻辑单元访问或支持厂商指定的形式的不对称访问。不支持Report Target Groups和Set Target Group命令。
01b:仅支持非对称逻辑单元访问(SPC-5)。SCSI目标设备不使用SET TARGET PORT GROUPS命令即可更改目标端口非对称访问。支持REPORT TARGET PORTGROUPS命令,不支持SET TARGET PORT GROUPS命令。
11b:支持显式和隐式的非对称逻辑单元访问。支持REPORT TARGET PORTGROUPS命令,支持SET TARGET PORT GROUPS命令。
3PC(Third-Part Copy)bit:
0b:SCSI目标设备不支持此命令
1b:SCSI目标设备支持第三方拷贝命令,比如EXTENED COPY命令。
PROTECT bit:
0b:逻辑单元不支持保护信息[x10] 。
1b:逻辑单元支持1/2/3保护类型。SPT空间在Extened Inquiry数据页。
ENCSERV(Enclosure Services)bit:
0b:SCSI目标设备不具有嵌入式附加组件。
1b:SCSI目标设备含有嵌入式附加组件。具体参考SES。
MULTIP(Multi Port)bit:
0b:SCSI目标设备只有一个端口,不实现多端口需求。
1b:SCSI目标设备具有多个符合SCSI标准的端口。
CMDQUE(Command Queuing)bit:
命令队列
1如果不支持BQUE bit,CMDQUE应置为0,表示逻辑单元不支持任务管理
2如果支持BQUE bit,CMDQUE和BQUE表示的任务管理模式如下表描述
T10 VENDOR IDENTIFICATION field:
T10厂商标识字段,包含8byte左对齐的ASCII信息。用于表示产品厂商,供应商表示应为INCITS分配的表示。8byte~15byte表示“SEAGATE”。
PRODUCT IDENTIFICATION:
产品表示字段,左对齐的ASCII信息。16byte~31byte使用空格(20h)填满。
PRODUCT REVISION LEVEL field:
产品版本等级字段,使用左对齐ASCII信息。32Byte
VERSION DESCRIPTOR fields:
版本描述字段,用于标识SCSI目标设备的目标设备的8个标准。可参考最新的SPC
Copyright Notice field:
版本声明字段,Seagate使用96~143byte提供版权声明ASCII码。
2.4. MODE SENSE 6
查询硬盘参数命令为设备Server端向应用Client端上报参数的方法,是MODE SELECT命令的互补命令。(6字节)
OP CODE:0x1Ah
DBD(disable block descriptor)bit:
0b:表示设备server端可能在MODE SENSE date中返回0或者更多的块描述符。
1b:表示设备server端不用在MODE SENSE data返回块描述符。
PC(Page Control)field:
表示请求的参数类型,对应值如下表:
11b的错误处理见手册。
PAGE CODE and SUBPAGE CODE fields:
PAGE CODE和SUBPAGE CODE字段指定要返回的模式页面和子页面。如下表
ALLOCATION LENGTH field:
分配长度通知目标设备为返回数据分配了多少空间。错误处理详见手册
2.5. MODE SENSE 10
查询硬盘参数命令为设备Server端向应用Client端上报参数的方法,是MODE SELECT10命令的互补命令。(10字节)
OP CODE:0x5Ah
LLBAA (Long LBA Accepted) bit:
0b:设备Server端LONGLBA在参数数据中为0并返回。
1b:设备Server端返回参数数据并且LONGLBA位返回值为0
其他字段参考MODE SENSE(6)。
2.6. START STOP UNIT
启动/停止单元命令请求设备Server更换逻辑单元电源功率、加载或者弹出介质操作。包含指定设备server端通过控制功率和定时器来使能或禁止介质访问操作的直接访问块设备。
如果设备Server端正在处理该命令,后续有确认过的CDB请求逻辑单元执行启动/停止单元命令更换电源状态的话,设备server端应中断后续的启动/停止单元命令,CHECK CONDITION,sense key设置为NOT READY,sense code设置为LOGICAL UNIT NOT REAY, START STOP UNIT COMMAND IN PROGRESS。
OP CODE:0x1Bh
IMMED(Immediate)bit:
0b:设备server端在操作执行完成后返回状态信息。
1b:设备server端在CDB验证过后尽快返回状态信息。
POWER CONDITION field and POWER CONDITION MODIFIER field:
功率控制状态字段,功率条件修改。如果支持电源条件则POWER CONDITION值设为非0,START和LOEJ位忽略。如下表所述
如果START STOP UNIT命令指定的电源条件与正在进行的操作冲突,在启动/停止单元命令以GOOD状态完成后,逻辑单元可能没有电源条件请求的命令,这个不是个错误。
NO_FLUSH bit:
0b:表示在进入任何阻止访问介质电源条件之前,包含cache的逻辑单元所有的逻辑块写入媒介中,以应答SYNCHRONIZE CACHE命令其中SYNC_NV位[徐11] 设置为0,LOGICAL BLOCK ADDRESS字段设置为0,NUMBER OF LOGICAL BLOCKS设置为0
1b:在进入任何阻止访问介质功率条件之前,逻辑单元不应将缓存的逻辑块写入媒介。
LOEJ (load eject) bit:
加载/弹出位
0b:表示逻辑单元不会对加载/弹出介质做任何操作。
1b:如果START 位同时为0,则逻辑单元卸载介质。如果START位同时为1,则表示逻辑单元加载介质。如果支持POWER CONDITION字段,POWER CONDITION设置非0h,设备server端应该忽略LOEJ位。
START bit:
0b:设备server端执行如下操作
a) 使逻辑单元转换到停止电源。
b) 停止任何已经使能的空闲状态定时器。
c) 停止任何已经使能的待机状态定时器。
1b:设备server端执行如下操作
1.符合SCSI传输协议标准定义的要求
2.逻辑单元转换到有效的power condition;
3.初始化使能任何空闲状态定时器。
4.初始化使能任何待机状态定时器。
如果power condition字段支持,同时设置为非0h值,设备server端应忽略START位。
2.7. READ CAPACITY 10
返回当前硬盘容量。请求设备server端向date-in缓冲区传送直接访问块设备的参数数据和媒介格式[x12] 。可以像处理HEAD OF QUEUE任务属性一样处理此命令。如果逻辑单元支持protection information,应用client端必须使用16字节的READ CAPACITY。
OP CODE:0x25h
此功能协助存储管理软件确定是否在CDB中描述的逻辑块地址起始有足够空间,包含频繁访问的数据结构,不会引起额外的延迟。
LOGICAL BLOCK ADDRESS field:
废弃。
PMI (Partial Medium Indicator) bit:
废弃。
2.8. REQUEST SENSE[x13]
请求查询Sense命令请求设备Server端发送Sense Date到应用client端。
OP Code:0x03h
DESC(Descriptor Format)bit:
描述格式位
0b:返回固定格式sense data
1b:返回描述格式sense data
ALLOCATION LENGTH field:
应用Client端应该请求252字节的sense data,以确保他们取回所有的sense data。如果求情的字节少于252, sense data可能已丢失,因为带有任意allocation length的请求REQUESET SENSE命令会清楚sense data
Sense data 应在SAM-5规定的条件下可用并清除。如果设备server端没有其他sense data可回复,则如下:
(1) 返回sense key设置为NO SENSE, sense code设置为NO ADDITIONAL SENSE INFORMATION
(2) 以GOOD状态完成REQUESET SENSE命令。
(3) 命令完成后,逻辑单元在接收REQUESET SENSE命令之前应返回相同的有效的power condition 。REQUESET SENSE命令不可以重启任何power condition定时器。
设备server端应向REQUESET SENSE命令返回CHECK CONDITION状态,上报特定的REQUESET
SENSE本身的异常状态。
设备Server端应返回至少18字节的参数数据响应一[x14] 个REQUESET SENSE命令,并且DESC设置为0。应用Client端可以确定返回了多少sense data,通改过检验CDB中的ALLOCATION LENGTH字段和sense data中的ADDITIONAL SENSE LENGTH字段。如果allocation length小于sense data长度,设备server端不可以适应截断部分来调整additional sense length。
2.9. SYNCHRONIZE CACHE[x15]
同步缓存信息命令,请求设备server端确保指定的逻辑块的最新数据记录在非易失性cache和媒介上。逻辑块包含用户数据,如果媒介启用了保护信息,则逻辑块包括保护信息。由于同步缓存的操作,逻辑块可能会或可能不会从易失性和非易失性cache中删除。
OP CODE:0x35h
IMMED(Immediate)bit:
0b:设备server端在同步缓存操作执行完成后返回状态信息。
1b:设备server端在CDB有效后尽快返回状态信息。如果IMMED位为1且设备Server端不支持IMMED,设备Server端以CHECK CONDITION状态结束,sense key置为ILLEGAL REQUEST,sense code置为INVALID FIELD IN CDB。
如果IMMED位置为1,synchronize cache操作未完成,Cathing mode page定义的SYNC_PROG定义设备server动作行为。
LOGICAL BLOCK ADDRESS field:
分配长度字段告诉设备client端在Data-In-Buffer已经申请的长度。
GROUP NUMBER field:
组号字段与命令相关的的属性[x16] 收集到指定的组。一个组好字段设置为0表示与该命令相关的任何属性都不收集到任何组中。
NUMBER OF BLOCKS field:
块数量字段指定应同步的逻辑块的数量,由LOGICAL BLOCK ADDRESS字段指定逻辑块的起始地址。该字段设置为0表示LOGICAL BLOCK ADDRESS字段中指定开始位置到介质上最后一个逻辑块的所有逻辑块都应进行同步。如果logical block address 加上 the number of blocks超过了过媒介的容量,设备server端以CHECK CONDITION状态终止命令,sense key设置为ILLEGAL REQUEST,sense code设置为LOGICAL BLOCK ADDRESS OUT OF RANGE。不存在cache内的逻辑块不被认为是错误。
2.10. SEEK 10
硬盘LBA定位,请求硬盘驱动来定位指定的逻辑块地址。
OP CODE:0x2Bh
LUN(Logical Unit Number)field:
逻辑数据块0,Seagate驱动只支持Logical Unit Number
LOGICAL BLOCK ADDRESS field:
指定4byte逻辑地址。驱动在收到命令后定位指定的地址。最大的逻辑块地址在Read Capacity Data定义。
CONTROL byte:
在1.2.7中定义的描述。
2.11. MODE SELECT 6
模式选择指令(6)使应用client去指定媒介、逻辑单元或者外设参数设备server端的模式。设备server端需要执行MODE SENSE(6)命令。应用Client端在每个MODE SELECT执行之前先发出相应的MODE SENSE命令,来确定支持的mode pages,page lengths和其他参数。关于Mode page[x17] 参见手册。
OP CODE:0x15h
PF(Page Format)bit:
0b:在块描述(block descriptors)之后的所有参数为厂商配置。
1b:表示消息投和块描述被构造为手册中定义的相关参数,如果RTD为1,则忽略PF值。
RTD(revert to defaults)bit
0b:表示设备server端应基于CDB中其他字段和参数来处理MODE SELECT命令
1b:如果RTD_SUP位置为1,RTD位置为1表示设备server服务端应该还原:
a)如果SP置为0,所有模拟页面的当前模式页面值为默认值
b)如果SP置为1,所有页面的当前mode page和已保存的mode page恢复为默认值。
SP(save pages)bit:
0b:表示设备server端应该执行指定的MODE SELECT操作,不需要保存mode pages。如果逻辑单元在当前和保存的mode pages之间实现任何差别,则命令应以CHECK CONDITION状态终止,sense key设置为ILLEGAL REQUEST,sense code设置为INVALID FIELD IN CDB。如果SP位设置为1则设备服务端应该执行指定的MODE SELECT操作,然后将所有保存的mode page(包括在Data-Out缓存中发从的)保存在非易失性厂商指定的位置。通过MODE SENSE命令在每个mode page第一个字节中返回PS(parameter saveable)来保存指定的mode pages.
1b:表示如果在MODE SENSE数据中PS位设置为1,通过使用MODE SELECT命令发送可以保存的mode pages。如果逻辑单元未实现已保存的mode pages同时SP位设置为1,则命令应以CHECK CONDITION状态终止,则sense key设置为ILLEGAL REQUEST,sense code设置为INVALID FIELD IN CDB。
PARAMETER LIST LENGTH field:
参数列表长度,表示指定的mode parameter list的长度,这个长度应包含在Data-Out缓冲区中。一个参数列表长度为0表示指定Data-Out缓冲区为空,这种情况不认为是错误。
如果参数列表长度导致任何mode parameter head,模式描述,模式page被截断,则命令操作应该以CHECK CONDITION结束,sense key设置为ILLEGAL REQUEST,sense code被设置为PARAMETER LIST LENGTH ERROR。
Mode parameter list 在MODE SENSE中定义,每个模式参数列表都以device-type相关的方式定义,在使用的命令标准中找到每种模式中各设备类型唯一的定义。
以下所述情况,设备server端以CHECK CONDITION状态终止,sense key设置为ILLEGAL REQUEST,sense code设置为INVALID FIELD IN PARAMETER LIST,不需要改变任何mode parameter参数:
a)应用client端将设备上报为不可更改的任何字段设置与当前值不同。
b)应用client端将模式参数头或块描述中的任何字段设置为不支持的值。
c)应用client端发送的mode page的页面长度不等于MODE SENSE命令返回的page长度,
d)应用client端发送了不支持的模式参数值,并未对该模式的参数进行取整。
e)应用client端将模式参数中的任何保留字段设置为非0,并设备server端检查保留字段。
设备server端可以更改任何模式参数在任何mode page(甚至是上报的不可更改的)。
设备server端根据MODE SELECT命令之前存在的模式参数与当前值来验证不可更改的模式参数。
2.12. MODE SELETCT 10
模式选择指令(10)使应用client去指定媒介、逻辑单元或者外设参数设备server端的模式。设备server端需要执行MODE SENSE(10)命令。应用Client端在每个MODE SELECT执行之前先发出相应的MODE SENSE命令。
OP CODE:0x55h
2.13. UNMAP
取消LBA映射,请求设备server使一个或者多个LBA取消映射。NUMAP命令是可以支持精简配置实现的命令之一。
OP CODE:0x42h
ANCHOR [x18] bit:
0b:表示指定的LBA取消映射的操作都将被执行并解除分配
1b:表的指定的LBA取消映射的操作都将被执行并被锚定。
错误处理见手册。
GROUP NUMBER field:
租号字段,表示指定与命令关联的属性收集到同一个租号内。租号字段为0表示与命令相关的属性不要收集到任何组中。
PARAMETER LIST LENGTH field:
表示从应用client端发送到设备server端的UNMAP 参数的字节长度。字段为0表示不发送任何数据。
CONTROL byte:
在1.2.7中定义的描述。
UNMAP parameter list
参数列表定义详细见手册。
2.14. WRITE SAME 10
写相同数据(10),请求设备server端从Data-Out缓存中以指定的LAB范围内的每个LBA传输单个逻辑快。a)执行逻辑块内容写操作或者b)unmap操作。操作说明见手册。
OP CODE:0x41h
WRPROTECT [x19] 写保护:
见write写字段
LOGICAL BLOCK ADDRESS field:
见1.2.3
GROUP NUMBER field:
见1.2.8
ANCHOR and UNMAP bits:
如果逻辑单元支持逻辑块配置管理(请参阅SBC-4),则ANCHOR位,UNMAP位和ANC_SUP位在逻辑块配置VPD页面(请参阅5.4.13)确定设备服务器如何处理下表中所述的命令。
NUMBER OF BLOCKS field:
表示指定写入的连续逻辑块的数量,从逻辑块指定的LOGICAL BLOCK ADDRESS开始。该字段设置为0表示LOGICAL BLOCK ADDRESS字段表示写入指定开始位置到介质上最后一个逻辑块的所有逻辑块。如果logical block address 加上 the number of blocks超过了过媒介的容量,设备server端以CHECK CONDITION状态终止命令,sense key设置为ILLEGAL REQUEST,sense code设置为LOGICAL BLOCK ADDRESS OUT OF RANGE。
2.15. WRITE SAME 16
写相同数据16字节与10字节内容相同,主要在逻辑块地址和块数量最大长度不同。
OP Code:0x93h
NDOB bit:
0b:设备server端应使用Data-Out缓冲区的逻辑块数据来处理命令。
1b:设备server端从Data-Out缓冲区中不传输数据。详细内容见手册。
2.16. VERIFY 10
校验数据,请求设备server端检验指定媒介上的逻辑块。基于VRPROTECT字段和媒介格式,每个逻辑块都包含用户数据,并可能包含保护信息[x20] 。
OP Code:0x2Fh
包含的缓存逻辑单元应将引用的cache写入逻辑单元的媒介中(见2.9的SYNCHRONIZE CACHE的SYNC_NV的bit位)
DPO bit:
见READ(10)命令
GROUP NUMBER field:
组号字段,表示指定与命令关联的属性收集到同一个租号内。租号字段为0表示与命令相关的属性不要收集到任何组中。
BYTCHK(byte check) field:
具体含义见手册。
如果 byte-by-byte比较失败,则设备server端以CHECK CONDITION状态终止,并将sense key设置为MISCOMPARE,并将sense code设置为此条件的适当值。
VERIFICATION LENGTH field:
验证长度字段,指定需要验证的连续逻辑块的数量,通过LOGICAL BLOCK ADDRESS字段来指定逻辑块开始的位置。如果BYTCHK设置为1,则VERIFICATION LENGTH字段指定设备server端从Data-Out缓存中传输的逻辑块数。如果此字段设置为0表示没有逻辑块校验,这种情况不应被认为是错误。如果LOGICAL BLOCK ADDRESS加上VERIFICATION LENGTH字段表示的长度超出媒介容量,设备server端应该以CHECK CONDITION状态结束,sense key设置为ILLEGAL REQUEST,sense code设置为LOGICAL BLOCK ADDRESS OUT OF RANGE。验证长度字段受VPD页面中的块限制。
如果BYTCHK字段设置为00b、01b/11b,设备server端应基于VRPORTECT从介质或者date-out缓存读取保护信息,含义见手册。
2.17. VERIFY 12
OP code:0xAFh
含义可见verify 10
2.18. VERIFY 16
OP code:0x8Fh
含义可见verify 10
2.19. READ 6
读数据请求设备server端读取指定的逻辑块并将传输这些到data-in缓存中。读取的每个逻辑块均包含用户数据,如果媒介使能了保护信息,还应包含保护信息。传输的每个逻辑块均包含数据信息不包含保护信息。返回在逻辑块的寻址块中写入的或在缓存后写入的最新数据。
此命令不提供缓存位控制。具有cache访问的直读块设备在READ(6)具有控制值,但本手册未定义默认值。如果需要显示控制,使用READ(10)命令。
OP code:0x08h
LOGICAL BLOCK ADDRESS field:
逻辑块块地址字段,表示命令访问的第一个逻辑块。如果逻辑块地址超出媒介容量,设备server端应以CHECK CONDITION状态终止,sense key设置为ILLEGAL REQUEST,sense code设置为LOGICAL BLOCK ADDRESS OUT OF RANGE。
TRANSFER LENGTH field:
传输长度字段,读取指定连续的数据逻辑块的数据,这些数据传输到data-in缓冲区中,逻辑块起始地址以LOGICAL BLOCK ADDRESS字段指定。当TRANSFER LENGTH设置为0表示需要读取256个逻辑块,其他数值表示指定数量的逻辑块需要被读取。如果LOGICAL BLOCK ADDRESS加上VERIFICATION LENGTH字段表示的长度超出媒介容量,设备server端应该以CHECK CONDITION状态结束,sense key设置为ILLEGAL REQUEST,sense code设置为LOGICAL BLOCK ADDRESS OUT OF RANGE。TRANSFER LENGTH字段值受VPD page中MAXIMUM TRANSFER LENGTH字段限制。
a) 对于READ(10),READ(12),READ(16)命令,TRANSFER LENGTH字段值设置为0表示没有逻辑块需要读取
b) READ(6)限制寻址空间为2G逻辑块,对于512字节的块长度在某些系统初始例程要使用READ(6)命令。系统初始化例程从READ(6)命令迁移到READ(10)命令,该命令能够以512字节寻址2TB的块长度,或者从READ(16)迁移寻址超过2TB。
在返回命令状态前,设备server端应从媒介中读取保护信息,详细见手册。
2.20. READ 10
读数据请求设备server端读取指定的逻辑块并将传输这些到data-in缓存中。读取的每个逻辑块均包含用户数据,如果媒介使能了保护信息,还应包含保护信息。传输的每个逻辑块均包含数据信息不包含保护信息。返回在逻辑块的寻址块中写入的或在缓存后写入的最新数据。
OP Code:0x28h
RDPROTEST field:
在返回命令状态之前,设备server端从媒介读取保护信息以检验保护信息。具体描述见手册。
DPO(Disable Page Out)bit:
0b:表示由Cache的RETENTION PRIORITY字段的确定保留优先级。
1b:表示设备server端为此命令访问的逻辑块分配最低的保留优先级,为提取或保留到cache中。
FUA (Force unit Access)bit:
0b:表示设备server端可以从易失性cache、非易失性cache或者其他媒介中读取逻辑块,该LBA指定的数据格。
1b:表示设备server端以指定的数据格式从LBA中,非易失性cache,或者媒介中读取逻辑块。如果易失性cache包含最新的逻辑块,设备server端在读逻辑块之前应该将逻辑块写入非易失性cache或媒介中。
RARC(rebuild assist recovery control) bit:
如果支持重建辅助模式,但未启用,则将忽略RARC位。如果支持并启用了重建辅助模式,则RARC表示按照SBC-4中定义处理读操作。
如果不支持重建辅助模式,RARC置为1,设备server端应以CHECK CONDITION状态终止,sense key设置为ILLEGAL REQUEST,sense code设置为INVALID FIELD IN CDB。
LOGICAL BLOCK ADDRESS field:
表示该命令访问逻辑块的起始位置。如果逻辑块地址超出媒介容量,则设备server端应以CHECK CONDITION状态终止,sense key设置为ILLEGAL REQUEST,sense code设置为LOGICAL BLOCK ADDRESS OUT OF RANGE。
GROUP NUMBER field:
组号字段表示与该命令相关属性收集到一组。GROUP NUMBER设置为0表示不收集到任何组中。
TRANSFER LENGTH field:
传输长度字段,读取指定连续的数据逻辑块的数据,这些数据传输到data-in缓冲区中,逻辑块起始地址以LOGICAL BLOCK ADDRESS字段指定。该字段设置为0表示没有逻辑块需要被读取。非0数值表示需要被读取的块数量。如果逻辑块地址加传输长度超过媒介容量,设备server端应以CHECK CONDITION状态结束,sense key设置为ILLEGAL REQUEST,sense code设置为LOGICAL BLOCK ADDRESS OUT OF RANGE。TRANSFER LENGTH字段受VPD page中MAXIMUM TRANSFER LENGTH字段限制
2.21. READ 12
OP code:0xA8h
功能以及各字段定义与READ(10)相同。
2.22. READ 16
功能描述与READ(10)相同
OP Code:0x88h
DLD2,DLD1 and DLD0 bits:
DLD(Duration limit descriptor),命令持续时间由DLD2,DLD1,DLD0限制,详见手册。CDLP字段描述参见SPC-5。
其他字段定义如READ(10)所述。
2.23. WRITE 6
写数据,T10 已过时,在某些产品上任然需要使用。
写数据命令,请求设备server端从Data-Out缓冲区传输指定的逻辑块并写入。传输的每个逻辑块均包含用户数据,但不包含保护信息。每个写入的逻辑块包含用户数据信息,如果媒介驱动并使能了保护信息,还应该包含保护信息。
[x21]
OP Code:0x0Ah
Cache Control bit字段对此命令不支持。具有cache访问的直写块设备在WRITE(6)具有控制值,但本手册未定义默认值。如果需要显示控制,使用WRITE(10)命令。
LOGICAL BLOCK ADDRESS field:
见1.2.3定义
TRANSFER LENGTH field:
表示需要从Data-out缓冲区中传输的连续的逻辑块数据,以LOGICAL BLOCK ADDRESS field字段表示逻辑块的起始位置。TRANSFER LENGTH field设置为0表示有256个逻辑块需要写入,其他任何数值表示需要写入的逻辑块的数量。如果LOGICAL BLOCK ADDRESS 加上TRANSFER LENGTH 超出媒介容量,设备server端应该以CHECK CONDITION状态结束,sense key设置为ILLEGAL REQUEST,sense code设置为LOGICAL BLOCK ADDRESS OUT OF RANGE。TRANSFER LENGTH字段值受VPD page中MAXIMUM TRANSFER LENGTH字段限制。
如果WRITE(6)命令在保护信息使能下,设备server端的写每个逻辑块的操作见手册。
2.24. WRITE 10
写数据(10字节),功能描述与WRITE 6相同。
OP Code:0x24h
见READ(10)中对DPO bit的定义。
LOGICAL BLOCK ADDRESS field定义见1.2.8。
GROUP UNMBER field定义见SPC-5。
设备server端根据WRPOTECT字段校验从Data-Out缓冲区传输保护信息。详见手册。
FUA[x22] bit:
2.25. WRITE 12
2.26. WRITE 16
2.27. WRITE VERIFY 10[x23]
写校验,请求设备server端从Data-out 缓冲区传输指定的逻辑块,将其写入到媒介中,然后验证是否已经正确写入。每个逻辑块都基于WRPROTECT字段和媒介格式,其中包含用户数据并可能包含保护信息。逻辑块数据仅从data-out缓冲区一次传输到设备server端。
OP Code:0x2Eh
如果实现了错误验证恢复模式,则此模式页面中当前设置以及读-写错误恢复模式将制定验证错误标准。如果这些mode pages没有实施,则验证标准是特定于厂商定义。
BYTCHK:参见VERIFY(10)定义
2.28. WRITE VERIFY 12
操作说明同WRITE VERIFY(10)相同
2.29. WRITE VERIFY 16
操作说明同WRITE VERIFY(10)相同。
2.30. REPORT LUNS
上报逻辑块数量信息。请求将I_T关联可访问的外围设备逻辑单元清单发送给应用server端。逻辑清单是一个列表,其中应包括具有PERIPHERAL QUALIFIER的值为0000b的所有的逻辑单元号。除000b和011b意外的PERIPHERAL QUALIFIER值得逻辑单元的逻辑单元号可以包含在逻辑单元清单中。PERIPHERAL QUALIFIER值为011b的逻辑单元号不应该包含在逻辑单元清单中。
OP code:0xA0h
SELECT REPORT field:
指定上报的逻辑单元地址类型,详见手册。
ALLOCATION LENGTH field:
请求长度,见1.2.6。错误处理方式见手册。
设备server上报设备逻辑清单见手册。
特殊字段定义
内核include/scsi_proto.h
Service response = Execute Command (IN (I_T_L_Q Nexus, CDB, Task Attribute, [Data-In Buffer Size],
[Data-Out Buffer], [Data-Out Buffer Size], [Command Reference Number], [Task Priority]),
OUT ([Data-In Buffer], [Sense Data], [Sense Data Length], Status))
通讯模型