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

抓包与解析的前提,是先把 UFS 的协议栈“分层看清楚”。UFS 并不是单一协议,而是由 UFS 应用层命令集(基于 SCSI)、UniPro 传输层、MIPI M-PHY 物理层 以及 UFS 互连层(UIC) 共同组成的复合体系。抓包工具看到的每一个字节,都要能对应到某一层的语义,否则解析只能停留在“看到数据但读不懂”的阶段。

一、UFS 整体架构:四层协作模型

从主机到设备,UFS 的通信路径自上而下分为四层,每层承担不同职责:

  • 应用层(UFS Command Set):以 SCSI 命令集为核心,定义 READ(10)、WRITE(10)、INQUIRY、TEST UNIT READY、UNMAP 等命令,以及 UPIU 中的命令、响应、数据描述符。
  • 传输层(UniPro):负责 UPIU 的封装、路由、流控、错误恢复,是 UFS 协议栈的“中枢”。
  • 互连层(UIC):管理链路启动、电源模式切换、属性读写,是主机与设备之间的控制通道。
  • 物理层(MIPI M-PHY):定义电气特性、Lane 数量、速率等级(HS-G1~G5)、PWM/HS 模式切换。

抓包时,逻辑分析仪捕获的是 M-PHY 上的差分信号,解析软件再逐层向上还原为 UniPro 帧、UPIU、SCSI 命令。理解这个“自下而上还原”的过程,是后续所有解析技巧的基础。

UFS 协议栈四层协作与抓包还原路径 主机侧(Host) 应用层 / SCSI 命令集 READ(10) · WRITE(10) · INQUIRY · UNMAP 传输层 / UniPro UPIU 封装 · 流控 · 错误恢复 互连层 / UIC 链路启动 · 电源模式 · 属性读写 物理层 / MIPI M-PHY Lane · HS-G1~G5 · PWM/HS 切换 设备侧(Device) UFS 设备命令解析 LUN · 逻辑块地址 · 数据缓冲 UniPro 端点 CPort · 流量类别 · 信用量 UIC 控制实体 DME · 属性 · 链路状态机 M-PHY 接收端 CDR · 均衡 · 时钟恢复 差分链路 抓包探针位置 逻辑分析仪捕获 M-PHY 差分信号

二、UniPro 与 UPIU:抓包解析的核心对象

UniPro 是 UFS 传输层的核心协议,它把上层 SCSI 命令封装成 UPIU(UFS Protocol Information Unit)。UPIU 是抓包解析中最常打交道的结构,常见类型包括:

  • Command UPIU:主机下发命令,携带 SCSI CDB、LUN、任务标签。
  • Response UPIU:设备返回执行结果,包含状态码、残余传输计数。
  • Data IN / Data OUT UPIU:承载实际读写数据。
  • Task Management UPIU:用于中止、查询任务等管理操作。

每个 UPIU 都有固定头部,关键字段包括 Transaction Type、Flags、LUN、Task Tag、Initiator ID、Data Segment Length。解析时先看 Transaction Type 判断 UPIU 类型,再用 Task Tag 关联同一条命令的请求与响应。

UPIU 头部关键字段(抓包解析顺序):
  byte 0      : Transaction Type   → 0x01=Command, 0x21=Response, 0x02=Data IN
  byte 1      : Flags              → bit5=Read, bit6=Write
  byte 2      : LUN                → 逻辑单元号
  byte 3      : Task Tag           → 命令关联标识
  byte 4      : Initiator ID / Command Set Type
  byte 8-9    : Data Segment Length
  byte 12-15  : Expected Data Transfer Length

三、MIPI M-PHY:物理层速率与模式

M-PHY 是 UFS 的物理层标准,决定了抓包时信号采样的关键参数。它支持两种主要模式:

模式 速率等级 典型速率 抓包关注点
PWM(脉宽调制) G1~G4 约 3 Mbps ~ 150 Mbps 低速初始化、链路启动阶段
HS(高速) HS-G1~HS-G5 约 1.25 Gbps ~ 23.32 Gbps 高速数据传输、眼图与均衡

抓包时若采样率不足,HS-G4/G5 的信号会严重失真,导致 UniPro 帧解析失败。因此物理层参数必须与抓包设备能力匹配。

四、SCSI 命令集:应用层语义来源

UFS 应用层直接复用 SCSI 命令集,常见命令与抓包中的 CDB 对应关系如下:

  • 0x28 READ(10):读取逻辑块,CDB 中包含 LBA 和传输长度。
  • 0x2A WRITE(10):写入逻辑块,结构与 READ(10) 对称。
  • 0x12 INQUIRY:查询设备信息,抓包中常见于枚举阶段。
  • 0x00 TEST UNIT READY:检测设备就绪状态。
  • 0x42 UNMAP:通知设备回收无效块,常用于 TRIM 场景。
解析技巧:在抓包工具中先过滤 Command UPIU,再根据 CDB 的 Opcode 判断命令类型。READ/WRITE 的 LBA 与长度字段位于 CDB 的第 2~9 字节,可直接与 Data IN/OUT UPIU 的 Data Segment Length 做交叉验证。

五、案例场景:一次 READ(10) 的完整抓包链路

假设主机发起一次 4KB 读取,抓包中应观察到如下序列:

  1. 主机发送 Command UPIU,Transaction Type=0x01,CDB Opcode=0x28,LBA=0x001000,长度=8 个逻辑块。
  2. 设备返回 Data IN UPIU,携带实际数据,Data Segment Length 与请求长度匹配。
  3. 设备返回 Response UPIU,Status=0x00 表示成功,Residual Transfer Count=0。
  4. 若 Status 非 0,需结合 Sense Data 判断是介质错误、非法 LBA 还是电源状态问题。
常见误区:只看到 Data IN UPIU 就认为读取成功。实际上必须等到 Response UPIU 且 Status=0x00,才能确认命令完整结束。抓包解析时若忽略 Response,容易把中间态误判为成功。

六、复盘:分层解析的检查清单

面对一段 UFS 抓包,建议按以下顺序逐层核对,避免跳层误判:

  • 物理层:Lane 数量、速率等级、PWM/HS 切换点是否正常。
  • UIC 层:链路启动、电源模式切换、属性读写是否完成。
  • UniPro 层:UPIU 类型、Task Tag 关联、流控信用量是否异常。
  • SCSI 层:CDB Opcode、LBA、传输长度、Status 与 Sense Data。
  • 数据层:Data IN/OUT 长度与请求是否一致,有无残余计数。