2、UFS协议基础:UFS架构、UniPro、MIPI M-PHY、SCSI命令集、UFS传输层与物理层

做UFS抓包分析,第一步不是打开分析仪,而是先建立一张“协议地图”。只有知道一个读命令从主机应用层出发,经过哪几层封装、在哪条物理链路上传输、最终在设备端如何被解析,才能在抓包数据中快速定位异常发生在哪一层。本节围绕UFS架构、UniPro、MIPI M-PHY、SCSI命令集以及传输层与物理层的关系,梳理抓包分析所需的协议基础。

一、UFS整体架构:从主机到设备的五层视角

UFS(Universal Flash Storage)并不是单一协议,而是一套分层协议栈。从主机侧看,自上而下通常包括应用层、UFS命令层(基于SCSI命令集)、UFS传输层(UTP)、UniPro层以及MIPI M-PHY物理层。设备侧与之对称,形成端到端的通信模型。

抓包时,分析仪通常挂在主机与UFS设备之间的M-PHY链路上,捕获的是物理层信号经过解析后的UniPro数据包。因此,理解“抓到的包对应哪一层”是分析的前提。例如,抓包工具显示的UTP传输单元(UTP Transfer Request)属于传输层,而其中的SCSI命令(如READ(10)、WRITE(10))属于命令层。

UFS 分层协议栈与抓包观测点 主机 Host 应用层 / 文件系统 UFS 命令层(SCSI 命令集) UFS 传输层 UTP UniPro 层 MIPI M-PHY 物理层 UFS 设备 Device 应用层 / 存储介质 UFS 命令层(SCSI 命令集) UFS 传输层 UTP UniPro 层 MIPI M-PHY 物理层 M-PHY 链路 抓包观测点 命令与数据语义 SCSI CDB / 状态 UTP 传输单元 UniPro 数据包 物理信号

二、UniPro与MIPI M-PHY:传输的“交通规则”与“道路”

UniPro(Unified Protocol)是UFS的链路层协议,负责在主机与设备之间建立可靠的逻辑连接。它定义了数据包格式、流控机制、错误恢复以及电源管理状态。抓包中常见的UniPro数据包类型包括:

  • UTP Transfer Request:承载SCSI命令或数据,是分析命令执行流程的核心对象。
  • AFC(Acknowledgement and Flow Control):用于确认接收和流控,异常时可能导致超时。
  • NAC(Negative Acknowledgement):表示接收错误,触发重传。
  • Power Mode Change:链路速率或功耗状态切换,如从PWM G1切换到HS G3。

MIPI M-PHY则是物理层规范,定义了电气特性、信号线对(Lane)、速率模式(PWM/HS)以及状态机。UFS通常使用两对差分线:一对用于发送(TX),一对用于接收(RX),支持全双工通信。M-PHY的速率档位(Gear)直接影响抓包时的采样率和信号完整性。

抓包提示:如果抓包工具只能解析到UniPro层而无法显示SCSI命令,通常是因为UTP传输单元未被正确重组,需检查抓包配置中的Lane映射和速率模式是否与实际链路一致。

三、SCSI命令集:UFS命令层的“语言”

UFS命令层采用SCSI命令集(SCSI Command Set),通过CDB(Command Descriptor Block)描述操作。常见的UFS操作包括:

SCSI命令 操作码 典型用途 抓包关注点
READ(10) 0x28 读取用户数据 LBA、传输长度、数据方向
WRITE(10) 0x2A 写入用户数据 LBA、传输长度、写保护状态
INQUIRY 0x12 查询设备信息 设备类型、厂商ID、产品版本
TEST UNIT READY 0x00 检查设备就绪 状态码、是否返回CHECK CONDITION
REQUEST SENSE 0x03 获取错误详情 Sense Key、ASC/ASCQ

在抓包分析中,SCSI命令的CDB字段是判断操作意图的直接依据。例如,READ(10)的CDB中第2~5字节为LBA,第7~8字节为传输长度。若发现LBA越界或传输长度为0,往往意味着上层软件参数配置错误。

四、传输层与物理层的协作:一次读操作的完整路径

以一次典型的READ(10)为例,数据流如下:

  1. 主机应用发起读请求,文件系统转换为SCSI READ(10)命令。
  2. UFS命令层将CDB封装为UTP传输单元,指定数据方向为设备到主机。
  3. UniPro层将UTP传输单元封装为UniPro数据包,分配标签(Tag)用于匹配请求与响应。
  4. M-PHY物理层将数据包转换为差分信号,通过TX Lane发送至设备。
  5. 设备M-PHY接收信号,UniPro层解析数据包,UTP层提取CDB并执行读操作。
  6. 设备将读取的数据通过RX Lane返回,主机UniPro层重组数据,UTP层完成传输,命令层返回状态。

抓包时,分析仪会同时捕获TX和RX方向的数据。一个常见的误区是只关注命令方向而忽略数据方向,导致无法判断数据是否真正返回。正确的做法是:先找到UTP Transfer Request中的SCSI命令,再根据Tag追踪对应的数据包和响应包,形成完整的“命令—数据—状态”三元组。

常见误区:将UniPro的NAC包误判为SCSI命令失败。实际上NAC是链路层重传机制,可能由信号完整性引起,而非命令本身错误。需要结合重传次数和物理层误码率综合判断。

五、抓包分析中的分层定位方法

面对一个抓包文件,建议按以下顺序定位问题:

  • 物理层:检查链路是否建立、速率模式是否匹配、是否有信号丢失或误码。
  • UniPro层:检查数据包序列号、AFC流控、NAC重传、电源状态切换是否正常。
  • UTP层:检查传输单元是否完整、Tag是否匹配、数据方向是否正确。
  • SCSI命令层:检查CDB字段、状态码、Sense Data,判断命令是否被设备正确执行。

例如,若抓包显示READ(10)命令已发出,但迟迟没有数据返回,且UniPro层出现多次NAC,则应优先排查物理层信号质量或链路速率配置,而不是怀疑SCSI命令本身。反之,若数据正常返回但状态为CHECK CONDITION,则应重点分析Sense Data中的ASC/ASCQ。

示例:一次READ(10)抓包关键字段
----------------------------------------
UTP Transfer Request:
  Tag: 0x1A
  Command: READ(10)  Opcode=0x28
  LBA: 0x0000A000
  Transfer Length: 0x0008 (4KB)
  Data Direction: Device -> Host

Data IN:
  Tag: 0x1A
  Data Length: 4096 bytes
  Status: GOOD

Response:
  Tag: 0x1A
  Status: GOOD (0x00)
----------------------------------------