UAS协议说明

news2024/11/19 14:35:19

1 概述

UAS(USB Attached SCSI)是一种位于SCSI协议框架下传输层的一种协议,其作用是通过基于USB的应用层协议约定,将SCSI的协议数据(Protocol Data Unit)用USB进行封装,从而实现使用USB物理连接进行SCSI协议通信的方式。

UAS实际上定义了两个规范,第一个是规定UAS本身使用方式的USB Attached SCSI,另一个是定义了UAS设备类型的Universal Serial Bus Mass Storage Class - USB Attached SCSI Protocol (UASP)。

目前网上介绍UAS相关概念的比较少,如何具体使用UAS和协议细节的就更少了,本文希望能够基于多个SCSI规范协议,并且与BOT进行对比,来帮助开发者更快理解UAS协议及如何使用。

由于UAS是建立在USB和SCSI的基础之上的,而USB和SCSI这两个本身又是非常庞大复杂的协议,为了便于阅读,接下来会先简单介绍一下UAS会涉及到的USB和SCSI的一些相关内容。

2 USB及SCSI基础

2.1 USB应用层简介

在USB 领域内,传输的发起方叫做Host(主机),接收方叫做Device(设备)。而在SCSI领域当中,传输的发起方叫做Initiator(发起方,启动器),接收方叫做Target(目标器)。在不同领域内虽然名字不一样,但是代表的含义都是相近的,为了便于描述,本文后面都将传输的发起方都称为主机,接收方都称为设备。

USB3的数据传输是通过数据包(DP,Data Packet)来进行传输的,当主机或是设备成功接收DP之后,都应当回复一个ACK(Acknowledgement)信号,表示DP成功接收到了。

之所以介绍ACK,是因为ACK在UAS当中被用作SCSI命令传输阶段的标志,在下文会用到。

USB传输定义了4种传输类型:控制传输,中断传输,批量传输和同步传输,UAS只会用到其中的控制传输(Control Transfer)和批量传输(Bulk Transfer)。其中控制传输通常只在USB刚建立好通信后获取描述符(Descriptor)阶段会用到,目的是获取一些设备最基本的运行状态,包括使用的是BOT还是UAS。批量传输则是用于进行大量的数据包传输,数据包的内容包含了SCSI的PDU等等。

最后还需要介绍一点的就是USB的端口(End Point),关于这个端口可以理解为当进行USB传输时,数据最开始需要一个FIFO来进行缓存,这样一个缓存区就被定义为一个端口。如果所有的DP都使用同一个端口的话,那么不管是什么类型的数据,都需要等上一个数据包处理完成之后才能进行本次传输。但是如果将数据类型进行区分,比如区分出来命令数据包、逻辑数据包等等,让不同的数据走不同端口的话,可以一定程度的提高性能。

1.2 SCSI协议结构框架和SCSI命令集

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

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

最上一层代表的是系统的各种应用驱动规范,中间介绍了SCSI命令集类型和SCSI架构,再往下就是SCSI所适配的部分传输总线。

如此庞大的协议很显然无法在一个文章里面说明,在这里只简单介绍一下SCSI最基本的东西:一条完整的命令传输过程和UAS所使用的指令集。

1.1.2.1 一个完整的SCSI命令组成

在SCSI Architecture Model(SAM)文档当中,定义了一次完整的SCSI命令收发该如何完成。任何传输协议都应当想办法适配这样一套规定。

完整的SCSI传输包含以下几个阶段:

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

在这里面所描述的命令,指的是SCSI的命令,也就是CDB(Command Descriptor Block),在CDB的结构当中,规定了不管什么类型第一个Byte必须表示的为Operation code(OpCode),不同的OpCode即代表了不同的命令,不同的指令集就表示是由不同的OpCode组成。

一次完整的命令传输除了命令,SCSI还规定设备必须回复命令状态(Status Code),命令状态包括了命令正常完成等各种状态,在后面的章节中会在详细介绍。

1.1.2.2 UAS所使用的SCSI命令集

UAS所需要支持的SCSI指令主要来来源于SPC(SCSI Primary Commands)和SBC(SCSI Block Commands),但是如果想要从包括UAS Spec在内的这三份文档当中去找到需要支持的命令集那可太难了。所幸的是还有一份UAS合规性验证标准UASP-ComplianceTestSpec,里面非常明确的列出了UAS要支持的命令及其来源:

(就这份资料整理,高低值得一个赞…)

3. UAS协议说明

在介绍完相关的一些基础知识之后,可以开始进行UAS的协议说明了,接下来大部分内容从USB Attached SCSI - 2当中总结得到的,有疑问的话也可以对照这一份Spec来看。

3.1 如何上报传输协议为UAS

在USB建立好连接后,会进行1.1.1章节当中所描述过的USB控制传输,通常被成为USB枚举,在这期间设备可以给主机上报各类描述符(Descriptor)。USB在进行UAS类型的描述符上报时,至少需要包含以下4种类型的描述符:

  1. 设备描述符(Device Descriptor)
  2. 配置描述符(Configuration Descriptor)
  3. 接口描述符(Interface Descriptor)
  4. 4个端口描述符(Endpoint Descriptors)

3.1.1 设备描述符:

以下几个字段,必须按照上图所示来进行配置:

  1. LENGTH
  2. DESCRIPTOR TYPE
  3. DEVICE CLASS
  4. DEVICE SUBCLASS
  5. DEVICE PROTOCOL

其余字段根据USB-2和USB-3协议上所规定的配置来进行配置即可,比如MAX PACKET SIZE,USB-3当中即可配置为512也可以配置为1024。

关于DEVICE CLASS,DEVICE SUBCLASS和DEVICE PROTOCOL的说明,在USB3和USB2的协议文档当中会有详细的介绍。另外在这里还上报了比较重要的ID VENDOR和ID PRODUCT,也就是常说的VID,PID。

3.1.2 配置描述符

该描述符,UAS规范只约束了长度和类型,其他参数都要参考USB3和USB2的协议。比较容易费解的是NUM INTERFACES,指的是可以配置的接口数量,这个指的不是端口数量,而是后面要说明的接口描述符的数量。如果该值配置为多个的话,那么要发送多个接口描述符。

3.1.3 接口描述符

以下字段必须按照上图所示配置:

  1. LENGTH
  2. DESCRIPTOR TYPE
  3. INTERFACE CLASS
  4. INTERFACE SUBCLASS
  5. INTERFACE PROTOCOL

这里面包含了用于区分BOT和UASP的字段,就是InterfaceProtocol,如果该字段值为50h的话,表示当前协议为BOT,如果该字段值为62h的话,则表示UAS。这个类型的定义在USB Mass Storage Class Specification Overview当中:

还有另外一个非常重要的潜规则字段,就是NUM ENDPOINTS端口数量。虽然没有着重说明,但是UAS最少需要支持的端口数量为4,下图为BOT协议当中描述的Interface Descriptor,其中就说明了NumEndpoints最少为2:

UAS之所以端口数量最少为4,是因为UAS将不同的DP分类为4个类型的数据:Data-in,Data-out,Command和Status。而BOT当中,只将数据分类为Bulk-in和Bulk-out。

3.1.4 端口描述符

端口描述符包含四类,其中大部分字段都已经明确规定,只有端口号可以自行定义:

该描述符应当为每一个端口描述符之后的第一个描述符字段,代表给这个端口分配了一个使用类型。

在UAS当中,尽管定义了四种端口类型,但是端口描述符还是只分成了Bulk-in和Bulk-out两类,具体的使用是由Pipe Usage Descriptor来定义的。

说明一下Pipe(管道)表示的是一种抽象的逻辑概念,代表设备和主机之间的数据传输关系。

定义端口类型的PIPE ID如下所示:

3.2 传输控制

UAS传输是通过Information Units来进行控制的,不同的IU类型识别是通过IU ID来进行区分的。

IU ID总是位于Command 和Status 管道传输的数据当中的第一个Byte,IU ID所对应的类型如下:

下面介绍一下UAS所包含的所有类型的IU及其作用。

3.2.1 Command IU

该类型IU承担了SCSI命令传输的功能,上图当中的CDB字段,即为SCSI当中的Command Descriptor Block字段(详见SPC-4)。

在UAS所有类型的IU当中,都包含了一个用于关联Command和Status的TAG,主机通过TAG来确认设备回复的Status是面向哪一个Command。如果在并发的命令当中出现了同样的TAG,那么设备应当终止命令响应。

除此之外,COMMAND IU还包含了命令优先级,命令属性:

其中ACA表示的是一种自动应急处理,建立ACA之后主机只会接收指定命令的响应,现在比较少使用。

由于CDB本身是可变长度的,因此还有字段描述了CDB的附加长度,如果本身是短CDB,那么多余的数据应当被忽略。LOGICAL UNIT NUMBER标记了当前命令是发送给哪一个LOGIC UNIT。

3.2.2 READ/WRITE READY IU

由设备发送到主机,表示准备好进行数据接收/发送。

但是如果是通过USB3进行的连接,设备就不应当回复Read/Write Ready IU,而是回复一个USB3当中定义的ERDY(Endpoint Ready),ERDY虽然不是IU,但是也包含可以用于回复TAG的字段。

3.2.3 SENSE IU

SENSE IU是设备发送给主机的,用于传递SCSI状态,SENSE IU的传递被包含在了完整SCSI命令传输的定义当中,也就是命令发送完成响应(Send Command Complete response)阶段。

需要说明的是STATUS QUALIFIER虽然定义了字段在那里,但是目前为止还没有实际用途。

STATUS字段代表的就是在1.1.2.1当中所描述,完整SCSI传输当中需要包含的Status codes,可以在SAM文档当中查询,列表如下:

而后面的SENSE DATA,只有当Status codes为CHECK CONDITION时才会包含在内,通常是在命令出现异常需要进行状态检查时,或者在收到REQUSET SENSE命令的时候才会出现SENSE DATA,SENSE DATA的具体定义详见SAM-4 5.8.6章节。

3.2.4 RESPONSE IU

用来从设备传递任务管理状态给主机,与SENSE IU不一样的是,RESPONSE IU是用来回应TASK MANAGEMENT IU的,或者是当COMMAND IU出现错误的时候来报告错误信息的。

3.2.5 TASK MANAGEMENT IU

TASK MANAGEMENT IU是由UAS主机的任务管理器发送的,用于进行指定逻辑单元的任务管理。

根据TASK MANAGEMENT FUNCTION字段,可以进行终止指定命令或者终止全部命令等操作。

4. UAS与BOT的差异

BOT比UAS早诞生了大约9年,UAS是和USB3.0一同出现的。UAS作为新出现的传输协议,与BOT相比有很多的优点,接下来将会逐一介绍UAS和BOT之间的一些差异。

4.1 性能

由于UAS的命令流处理优化,一条命令的处理完成不需要等待上一条命令处理,即使在BOT和UAS使用同样USB3带宽的情况下,UAS的性能依旧比BOT高出不少。之所以有这样的明显差距,主要得益于UAS提高了对CPU的性能利用率。

4.2 全双工

USB本身是支持全双工数据传输的,但是BOT协议并没有支持全双工模式的命令,在UAS当中新增了对全双工传输命令XDWRITEREAD(10) (详见SBC-3)的支持,可以实现同时data-out和data-in的数据传输:

4.3 命令平行处理

在BOT当中,一条SCSI在处理完成之前不允许发送新的命令,但是在UAS当中允许进行命令的并行,也就是一条命令完成之前可以发送新的命令,并且一条命令的完成状态可以在另一条命令正在传输的过程当中进行,能实现这样的功能主要得益于UAS对全双工的支持和多端口的设计。

4.4 命令集

UAS所支持的SCSI命令在BOT的基础上进行了一些扩展,如FORMAT UNIT、SEND DIAGNOSTIC和全双工命令XDWRITEREAD(10)等等。

并且基于TASK MANAGEMET IU的,还额外支持了针对UAS的任务管理命令,如下表所示:

另外需要说明的是,尽管UAS可以支持SCSI的Unmap命令(类似SATA的Trim),但是这个并不是必须的,可以选择不支持。在SBC-3当中定义了Thin provisioning,是一类可以提供数据精简的操作,如果设备支持这类操作的话,在READ CAPACITY(16)(Opcode为9Eh)命令返回的数据当中,TPE(thin provisioning enabled)字段需要为1。

所以逻辑上并不是UAS设备支持Unmap,而是BOT的主机和设备都没有支持Unmap,UAS的主机选择支持Unmap,所以UAS设备才可以选择支持Unmap操作。是否支持Unmap主要受限的还是SCSI协议,而不是UAS协议。

Unmap操作对于固态存储的设备来讲有非常大的好处,可以减少逻辑数据分区当中的有效数据,从而提高回收效率降低磨损,因此Unmap也被认为是UAS的一大亮点。

参考文档

Universal Serial Bus 3.2 Specification(USB3.2)

Universal Serial Bus Mass Storage Class Specification Overview

USB Attached SCSI - 2

UASP-ComplianceTestSpec

Universal Serial Bus Mass Storage Class Compliance Test Specification

SCSI Architecture Model - 4(SAM - 4)

SCSI Primary Commands - 4(SPC - 4)

SCSI Block Commands - 3 (SBC-3)

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wireshark网络抓包详解

一、简介 Wireshark是一款非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。 为了安全考虑,wireshark只能查看封包,而不能修改封包的内容,或者发送封包。 wireshark能获取HTTP,也…

【Android】(最新)跑马灯文字水平滚动(79/100)

先上效果: Android系统中TextView实现跑马灯效果,必须具备以下几个条件: android:singleLine“true”android:ellipsize“marquee”android:marqueeRepeatLimit“marquee_forever”TextView必须单行显示,即内容必须超出TextView…

Jetpack Compose 实现了一个丝滑流畅的页面展开和关闭的效果动画

Jetpack Compose 将动画实现的门槛降低了,不过Compose目前还不支持共享元素过渡。 (上篇文章Jetpack Compose开发的本地笔记本)的动画效果的实现 转跳前的准备工作 定义State枚举类来表示页面的三种状态: Closing(关闭状态) Closed(关闭完成状态) Opening(展开状…

找不到vcruntime140.dll,无法继续执行代码?多种解决方法解析

找不到vcruntime140.dll,无法继续执行代码?当你在尝试运行某个程序时,突然弹出一条错误提示框,告诉你无法继续执行代码,因为找不到vcruntime140.dll。这个问题很常见,但是它可能会让你感到困惑和疑惑。这篇文章将详细介…

chatgpt赋能Python-python_numpy遍历

Python NumPy遍历:使用高效的方式为数据科学家节省时间和精力 Python语言在数据科学领域中的地位越来越重要,并成为了数据科学家的首选语言之一。在解决数据问题时,NumPy模块是Python程序员经常使用的一个重要库。NumPy提供了快速的数组操作…

【大数据实训】—Hadoop开发环境搭建(一)

【大数据实训】—Hadoop开发环境搭建(一) 第一关、任务描述 本关任务:配置JavaJDK。 相关知识 配置开发环境是我们学习一门IT技术的第一步,Hadoop是基于Java开发的,所以我们学习Hadoop之前需要在Linux系统中配置Jav…

Flowable钉钉对接005-完成钉钉任务

企业中有自己的业务系统,审批都在业务系统中审批,如何结合移动办公的开放平台实现统一审批至关重要。 场景很简单,自己的系统中可以审批,钉钉上也可以审批,使用H5来适配,统一待办任务 统一待办审批 目标&am…

python获取tx弹幕数据并制作词云图

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 知识点介绍: 爬虫基本思路流程 requests模块的使用 pandas读取表格数据 环境介绍: 开发环境: python 3.8 运行代码 pycharm 2022.3 辅助敲代码 模块使用: requests >>> pip install requests pa…

​年轻人的情绪,都藏在知乎的短故事里

“谢邀,与世界分享我刚编的故事。” 这是一句在知乎被调侃的老梗。它源自于知乎上有众多隐匿的大佬,他们经历过各种奇闻轶事,也乐于分享传奇的人生经历,而这其间,很多真假难辨的事迹,也被很多用户笑称可以当…

这几款好用的软件分享给你

软件一:Handbrake Handbrake是一款免费开源的视频转码软件,适用于Mac、Windows和Linux系统。它可以将几乎所有视频格式转换为其他格式,包括MP4、MKV、AVI等等。作为一个强大的视频编码器,它可以压缩视频大小,并提供多…

Android Qcom USB Driver学习(十一)

该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) 基于TI的Firmware Update固件升级的流程分析usb appliction layers的数据 USB Protocol Package ①/② map to check password correct Package Format: Byte[0] Report Id Byte[1] Valid L…

玩转SpringCloud Alibaba,看阿里大佬的笔记是真香

大家都知道,SpringCloudAlibaba 风靡 Java 开发行业,各个公司都在用这套技术,所以咱们 Java 工程师不管是日常工作或是出去面试,都会用到或者被问到关于SpringCloudAlibaba的应用以及底层原理 所以说,小编下面带来一份…

用于视频编辑和渲染的最佳GPU是什么?

购买新的图形卡(GPU)可能很困难,尤其是如果涉及您所不熟悉的所有技术问题。 显卡市场上的大多数消费者只需要了解显卡在自己喜欢的游戏中的性能,并确定购买决定即可。但是,如果您想购买GPU进行视频编辑或3D渲染&#…

网络安全工程师考证指南

已经到2023年了,那么信息安全类证书最有前途的有哪些呢?今天和大家一起聊聊这个话题! 1.CISP(国家登记的信息安全专业人员) 就CISP而言,安全实践者基本耳闻,算是国内权威认证,毕竟有政府背景为认证做背书&…

微服务环境搭建(spring cloud Alibaba)(一)

模块: 商品模块, 订单模块, 用户模块 一. 1. 技术选型以及准备工作 maven : 3.8.8版本 数据库: MySQL 8.0.32 持久层: springData , jpa 其他java环境 : SpringCloud Alibaba 技术栈 2. 模块 设计 springcloud- alibaba 父工程 shop - common 公共模块 [ 实体类 ] sh…

【技术】多端能力服务统一是一种关键的技术和架构

多端能力服务统一是一种关键的技术和服务架构,旨在为不同终端设备提供一致的用户体验和功能。通过采用前端和后端技术的组合,如响应式 Web 设计、PWA、跨平台移动应用开发框架、RESTful API、GraphQL、WebSocket、Serverless 架构和微服务架构&#xff0…

实现并测试协同滤波算法

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 本次实验实现了基于用户和基于项的协同滤波算法,并在 Movielens 两个较小的数据集上进行了测试,测试采用 RMSE 进行评估 一、问题简述 1.1 推荐系统问题 推荐系统问题旨在用户推荐相关项,项…

如何利用CiteSpace快速锁定领域内最新研究热点并制作精美的可视化专题图

在科研工作中,我们常常需要面对海量的文献进行阅读和分析,如何在这些文献当中找出值得精读、细读的关键文献,挖掘学科前沿,找到研究热点就成为了开展研究之前首先需要解决的问题。CiteSpace作为一款优秀的文献计量学软件&#xff…

六、数据仓库详细介绍(ETL)经验篇

0x00 前言 日常工作中大多数时候都是在做数据开发,ETL 无处不在。虽然最近两年主要做的大数据开发,但感觉日常干的这些还是 ETL 那点事儿,区别只是技术组件全换了、数据量大了很多。 前几年数仓势微,是因为传统的那些工具数据库等…

每个程序员必备的基础设施--Codeium

自从 chartGPT3 横空出世以后,AI 技术越来越深入到每个人的生活中,这里不谈 AI 到底是不是真的存在着类人的思想和智慧,也不谈是否取代人类的问题。本着实用主义的原则,先让它能为我所用。 我在工作中已经深入使用了 chartGPT 和…