SCSI介绍和SCSI命令承载于各类总线的方式

1. SCSI协议简介

小型计算机系统接口(SCSI,Small Computer System Interface)是一种用于计算机及其周边设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准。虽然名字里面带个接口,但实际上是一种应用层协议。简单理解,就是系统想要跟任何硬件进行数据交互的话,都是通过SCSI协议来进行的,通过这样的分层,在系统不需要去适配各种各样的通信总线协议。

1.1 SCSI协议结构

SCSI由于其海纳百川的拓展性和兼容性,其协议结构非常的庞大,下图展示了一部分SCSI协议的内容:

从上图可以看到,向上SCSI提供了非常多的驱动规范给系统,以便能胜任各种系统需求。向下SCSI又提供了非常多的传输层协议,以便能够适配各种各样的传输总线,而上图还没有完全展示出SCSI支持的所有传输总线类型。

看到这个图很有可能会两眼一黑(最起码我就是),但是看过其中一些协议之后,会发现种类虽然比较多,但是都存在一些共性,毕竟都是围绕着同样的SCSI命令传输来设计的。

所以在最开始了解SCSI时,可以先了解一下SCSI自身的一些相关规范。

1.1.1 SCSI Architecture Model

定义了SCSI自身最基本标准的,就是SCSI Architecture Model(SAM)规范,其中包含了SCSI系统模型,SCSI标准的功能分区,以及适用于所有SCSI实现和试试标准的要求。

其中比较具有代表性的,比如定义了什么是CDB(Command Descripotr Block),CDB即为定义设备在收到后所需要进行的操作,也就是SCSI命令。但是CDB的结构长什么样,要在另外一份SCSI Primary Commands(SPC)文档当中查找:

这份文档给出了CDB的结构,可以看到对于CDB只有一条强制规定,就是首个字节必须为OPERATION CODE(Opcode),并且CDB长度有6、10、12、16字节长度的类型。

SAM当中还定义了Status codes,用来标记SCSI命令传输的状态:

最重要的,是定义了一个完整的SCSI命令传输,必须包含的阶段:

  1. 命令发送请求(Send SCSI Command request)
  2. 命令接收标志(SCSI Command Received indication)
  3. 命令发送完成响应(Send Command Complete response)
  4. 命令完成确认(Command Complete Received confirmation)

原文如下:

All SCSI transport protocol standards shall define the SCSI transport protocol specific requirements for implementing the Send SCSI Command request (see 5.4.2.2), the SCSI Command Received indication (see 5.4.2.3), the Send Command Complete response (see 5.4.2.4), and the Command Complete Received confirmation (see 5.4.2.5) SCSI transport protocol services.

也就是说不管是什么样的传输协议,如果要适配SCSI命令,就必须想各种办法来实现这4个小目标才能实现SCSI命令传输。

1.1.2 Command Set

由于SCSI所支持的设备类型非常多样,不同的设备作用范围不一样,因此SCSI给不同类型的设备划分了需要支持的SCSI命令集。像上一节提到的SPC,表示SCSI主要的命令,各种设备都需要或多或少的支持一些其中的命令。

其他类型的命令集有例如给存储设备使用的SBC(SCSI Block Command),给多媒体设备所使用的MMC(Multi-media Command)等等。

1.2 T10

既然介绍到SCSI了,就在介绍一下负责定义SCSI的组织:T10。T10是INCITS(InterNational Committee on Information Technology Standards)中的一个技术委员会,而INCITS又遵循ANSI(American National Standards Institute),所以最终还是一个美国协会。

理论上所有与SCSI相关的技术规范都可以在T10官网上找到(还得有权限。),而INCITS除了有T10,还有负责光纤通讯规范的T11,负责ATA/SATA规范的T13等等。

1.3 SCSI在系统中的层级

在Windows Storage Driver Architecture当中,最开始就介绍了Windows系统是如何通过层层驱动最终获取到硬件设备数据的:

最上层的IRP,即为I/O Request Packet,是Windows系统当中描述I/O数据请求的数据结构,Windows系统将数据请求通过IRP发送给存储类型驱动,也就是SCSI处理器。SCSI处理器在收到数据请求后根据不同的类型又转换成SRBs(SCSI Request Block),然后再经过了若干个驱动转换最终到达数据存储端口(Storage port driver)。

当SRB到达Storage prot driver之后,就会开始根据硬件设备所用的传输总线来区分不同的SRB传输方式了,在这当由于SCSI的普适性,有着各种各样的封装和转换,接下来将会挑一些比较常见的(我学得会的…)来介绍一下SCSI和这些协议的承接关系,希望能够扩展一些相关概念。

2. SCSI与多种数据总线关系

2.1 SCSI与USB & UFS

之所以将USB和UFS放在一个章节来介绍与SCSI的关联,是因为这两个协议都是采用了相似的方式,将SCSI的CDB进行了一次封装来进行传递的。也就是说USB和UFS设备,连接到以SCSI为数据交互的操作系统当中时,设备端最终解析的是经过封装的CDB。

2.1.1 SCSI与USB

从SCSI到USB,中间夹着一层有两种实现方式的传输协议,一种是BOT(Bulk-Only Transport),另一种是UAS(USB Attached SCSI)。BOT诞生的时间较早,定义于1999年。而UAS的话则年轻得多,与USB3.0一样定义于2008年。可能是得益于时代的进步,UAS的规范文档相较于BOT来讲要容易阅读一些,相关概念介绍的也比较清晰,为了防止产生误解,接下来会以UAS为例来介绍USB和SCSI的关联。

在1.1.1节中有介绍如何定义一个完整的SCSI命令传输,UAS为了适配这样的规则,在基于USB协议的基础上,给出了这样的一份适配方案:

  1. 命令发送请求(Send SCSI Command request) – Command Block Wrapper(COMMAND IU)
  2. 命令接收标志(SCSI Command Received indication) – 收到COMMAND IU的ACK
  3. 命令发送完成 (Send Command Complete response) – Command Status Wrapper(SENSE IU)
  4. 命令完成确认(Command Complete Received confirmation) – 收到SENSE IU的ACK

在这当中,IU(Information Unit)为UAS协议的内容,ACK(Acknowledge)为USB协议的内容。UAS通过这样的方式来完成一次SCSI完整命令传输的适配。

2.2.2 SCSI与UFS

UFS(Universal Flash Storage)规范定义于2011年,作为一个比较新的协议,从定义的时候就考虑清楚了要如何适配SCSI。因此在UFS的规范文档当中,UTP层(UFS Transport Protocol Layer)的描述就包含了SCSI的SAM相关说明。在UFS当中,SCSI命令传输所用到的相关信息如CDB,Status在UTP层被封装到UPIU(UFS Protocol Information Units )进行传输。

UFS如何适配一次完整的SCSI命令传输,UFS规范文档当中也直接以一份示例图来展现:

2.2 SCSI与ATA

ATA是Advanced Technology Attachment的缩写,是一种定义IDE设备的规范。旧的规范有PATA,即Parallel ATA,是一种并行的ATA接口,流行于上世纪80年代,现在已经基本没有电脑支持这个接口了。在PATA之后定义的SATA(Serial ATA)规范应该是更广为人知的,SATA作为串行接口,解决了并行接口信号串扰的问题,通信效率更高。

尽管Windows系统都在使用SCSI,很多电脑上也使用的是SATA的硬盘,但是SCSI与SATA并没有经过一个传输层协议的封装。

2.2.1 SCSI与SATA

SCSI与SATA的转换关系,正是准备要说的第二类SCSI连接方式,就是协议转换。使用SATA作为数据总线的设备,并不会收到SCSI发起端发送的SCSI命令,也就不会接收到SCSI的CDB,SATA设备解析的是ATA指令集。而SATA与SCSI的通信方式,是通过一层叫做SAT(SCSI ATA Translation)规范来定义的。

在SAT规范当中,明确规定了需要将哪些SCSI命令转换成ATA命令来进行数据传输,SAT-2当中很明确的给出了需要进行命令转换的列表:

不同的命令规定了不同的转换方式,其中比较特殊的命令是ATA PASS-THROUGH,与2.1当中传输层协议封装CDB相反,SCSI为了让主机能够发送指定的ATA命令,使用CDB在封装ATA命令下发到设备:

到这里可以看到,SCSI和ATA是一种命令转换的关系,与之比较类似的还有SCSI到NVMe的NVM Express:SCSI Translation。

随着SCSI和SATA逐渐普及,这之间却没有一个高效的桥梁,另外考虑到SATA本身也有一部分限制,比如只能半双工工作,因此在这样的需求下,又推出了兼容SATA的SAS(Serial Attached SCSI)规范。

2.2.2 SCSI与SAS

SAS可以兼容SATA的物理接口,接口速率最高都是6Gb/s,但是由于SAS对命令流处理优化,SAS硬盘的速度通常比SATA要高一些。

SAS与SCSI就跟USB/UFS一样,采用的是将CDB封装最终传输给设备进行SCSI命令解析的方式。同样的,SAS要想完整的进行SCSI命令传输,也需要适配SCSI传输的最基本4个阶段,SAS给出的适配方式如下:

  1. 命令发送请求(Send SCSI Command request) – Command frame
  2. 命令接收标志(SCSI Command Received indication) – Command frame ACK
  3. 命令发送完成 (Send Command Complete response) – Response frame
  4. 命令完成确认(Command Complete Received confirmation) – Response frame ACK

这里面的Command frame为SAS协议规定封装了CDB的数据结构,另外还包含了SCSI命令传输所需要的一些参数:

2.3 SCSI与TCP/IP

额外再把SCSI与TCP/IP的关系拿出来说一下,是单纯觉得SCSI的扩展性实在是太广泛了。SCSI与TCP/IP也是经过了一层封装协议,叫做iSCSI(Internet SCSI),经过iSCSI封装后,数据通过TCP/IP传输,能够将远程网络盘直接显示成电脑上的本地硬盘!

这种通过网络连接来附加存储的方式被称为NAS(Network Attached Storage),iSCSI是实现NAS的一种方式,另外还有iFCP、FCIP等标准。除了NAS,还有SAN(Storage Area Network)也能实现远程存储,不得不说互联网确实是热门行业,连实现方案都五花八门。

3. 结语

SCSI现在作为一种应用非常广泛的OS数据传输规范,以后只会更多的适配各种各样的传输总线,但是只要了解了SCSI本身的基本结构和两种与SCSI进行连接的方式(封装或转换),新的规范都需要适配SCSI自身的标准,学习起来也就没有太大的难度了。希望这篇文章能够以我比较浅薄的认识来给大家普及一些基本的概念和方法,为开发者们提供新的思路。

参考文档

Universal Flash Storgae(UFS)

Universal Serial Bus 3.2 Specification(USB3.2)

Universal Serial Bus Mass Storage Class Specification Overview

USB Attached SCSI - 2

Universal Serial Bus Mass Storage Class Bulk-Only Transport(BOT)

Storage driver design guide

Serial Attached SCSI Standard(SAS)

Serial ATA

NVM Express: SCSI Translation Reference

iSCSI Implementation and Best Practices on IBM Storwize Storage Systems

SCSI / ATA Translation - 2(SAT-2)

SCSI / ATA Translation - 3(SAT-3)

SCSI Architecture Model - 4(SAM - 4)

SCSI Primary Commands - 4(SPC - 4)

SCSI Block Commands - 3 (SBC-3)

为了方便大家学习(顺便捞点分),以上大部分参考文档已经上传资源,链接:

https://download.csdn.net/download/polley88/87814966

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/24390.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习的高精度野生目标检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度野生目标检测识别系统可用于日常生活中检测与定位野生目标目标,利用深度学习算法可实现图片、视频、摄像头等方式的野生目标目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测…

Apache DolphinScheduler——开源大数据调度器神器(国人之光)

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 1. 简 介 Apache DolphinScheduler(海豚调度),国人之光,是许多国人雷锋开源在Apache的顶级项目,主要功能就是负责任务的调度处理。 1.1 概 念 Apache DolphinScheduler是一个分布式去…

玩转用户旅程地图

图:史江鸿 从事需求分析和产品设计工作已经有几个年头了,我很享受这个职业。因为在这段职业历程中,我学到了很多有意思的方法和工具,用户旅程地图就是其中一个。 如今在国内外许多IT公司,用户旅程地图已经成为需求分析…

Python连接达梦数据库

python如果想连接达梦数据库,必须要安装dmPython。 简介:dmPython 是 DM 提供的依据 Python DB API version 2.0 中 API 使用规定而开发的数据库访问接口。dmPython 实现这些 API,使 Python 应用程序能够对 DM 数据库进行访问。 dmPython 通…

微服务之服务容错

Informal Essay By English Share a sentence that I think is very reasonable, as long as you can know the underlying logic of anything, you can hold it without fear 参考书籍: “凤凰架构” 引言 在 Martin Fowler 与 James Lewis合写的文章《Micros…

Linux内核源码分析 2:Linux内核版本号和源码目录结构

一、Linux的版本 1. 稳定版和开发版 Linux内核主要分为两种版本: 稳定版(长期支持版):稳定版的内核具有工业级的强度,可以广泛地应用和部署。而每一代新推出的稳定版内核大部分都只是修正了一些Bug或是加入了一些新的…

MySQL数据类型

文章目录 一、数据类型分类二、数值类型1.tinyint类型2.bit类型3.float类型4.decimal类型 三、字符串类型1.char类型2.varchar类型 四、日期和时间类型五、enum类型和set类型1.enum类型2.set类型 一、数据类型分类 MySQL的数据类型一共有如下几类,表格中简单介绍了…

企业级API网关之典型应用场景

目 录 01 企业面对API与网关的现状‍‍‍‍‍ 02 APIGW介绍及企业应用场景 03 总结 01 企业面对API与网关的现状‍ 在企业中,进行新的系统/应用/产品开发时,具有周密的流程:从需求分析、设计、开发、测试、发布与验收。所以,一…

bmp转jpg怎么转?bmp转换jpg的几个方法

bmp转换jpg的几个方法~什么是BMP呢?BMP是位图文件格式的一种,全称为Bitmap(位图),是一种基于像素的图像文件格式。BMP是Windows操作系统中最常用的图像格式之一,通常以.bmp或.dib作为文件扩展名。BMP文件格…

华芯微特SWM34-IO速度优化

对比测试了一下IO翻转速度在各种函数调用的情况下的差异 CPU运行速度150Mhz,SDRAM开 直接调用翻转函数 while(1) {GPIO_InvBit(GPIOA, PIN0); }速度大约5Mhz,主要是因为函数调用开销和函数内部的移位和异或操作,增加了指令的运行数量。 vo…

Rust每日一练(Leetday0012) 首末位置、插入位置、有效数独

目录 34. 查找元素的首末位置 Find-first-and-last-position-of-element-in-sorted-array 🌟🌟 35. 搜索插入位置 Search Insert Position 🌟 36. 有效的数独 Valid Sudoku 🌟🌟 🌟 每日一练刷题专栏…

Atcoder beginner contest 302

A - Attack AC代码&#xff1a; #include<iostream> #include<algorithm> #include<cstring> #define int long long using namespace std; signed main() {int a, b;cin >> a >> b;if (a % b 0) cout << a / b << endl;else c…

加密与解密 调试篇 动态调试技术 (二)

目录 常见的断点 1.INT 3 断点 检测 绕过 2.硬件断点 原理 我们给出硬件中断的例子 删除硬件断点 3.内存断点 原理 例子 删除 区别 总结 4.内存访问一次性断点 5.消息断点 例子 删除 6.条件断点 &#xff08;1&#xff09;按寄存器条件中断 &#xff08;2&…

【JDK】一、jdk17的下载与安装配置(图文说明超详细)

JDK17的下载与安装 前言一、JDK17下载1、官方下载地址 &#xff08; Oracle中国的官方网站&#xff09; 二、JDK17安装1、先看一下我现在的java版本和环境变量2、开始新的安装第一步&#xff1a;双击下载的jdk-17.0.7_windows-x64_bin.exe 进入到安装页面第二步&#xff1a;jdk…

sqlmap命令大全(附详细扫描流程)

一、sqlmap命令大全。 -u 指定目标URL (可以是http协议也可以是https协议)-d 连接数据库--dbs 列出所有的数据库--current-db 列出当前数据库--tables 列出当前的表--columns 列出当前的列-D 选择使用哪个数据库-T 选择使用哪个表-C 选择使用哪个列--dump 获取字段中的数据--…

破解mysql用户的密码

假如mysql数据库中有一个 prod_blb 用户&#xff0c;你作为root管理员&#xff0c;想知道它的密码&#xff0c;又不想修改它的密码。这个时候就只能通过获取到 prod_blb 用户加密的密码进程破译 1、MYSQL加密方式 MYSQL数据库的认证密码有两种方式&#xff0c;MYSQL 4.1版本之…

《Spring Guides系列学习》guide6 - guide10

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

【源码解析】流控框架Sentinel源码深度解析

前言 前面写了一篇Sentinel的源码解析&#xff0c;主要侧重点在于Sentinel流程的运转原理。流控框架Sentinel源码解析&#xff0c;侧重点在整个流程。该篇文章将对里面的细节做深入剖析。 统计数据 StatisticSlot用来统计节点访问次数 SpiOrder(-7000) public class Statis…

跨时钟域数据同步

跨时钟信号直接传输在信号跳变时违背本地时钟域的时序要求&#xff08;建立时间约束&#xff0c;保持时间约束&#xff09;&#xff0c;容易产生亚稳态&#xff0c;无法确定亚稳态何时结束以及结束时保持在何种状态上。 用同步器抑制亚稳态的往下传播的概率&#xff0c;根据情…

H3C IPSec IKE野蛮模式

这里使用H3C模拟器。 H3C IPSec IKE野蛮模式&#xff0c;又称为IKE Main Mode&#xff0c;主要是在第一阶段&#xff08;Phase 1&#xff09;的过程中提供身份保护。它主要用于VPN隧道建立过程中的密钥交换。以下是配置步骤&#xff1a; 创建IKE提案&#xff1a; system-view…