第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 命令。理解这个“自下而上还原”的过程,是后续所有解析技巧的基础。
二、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 对应关系如下:
0x28READ(10):读取逻辑块,CDB 中包含 LBA 和传输长度。0x2AWRITE(10):写入逻辑块,结构与 READ(10) 对称。0x12INQUIRY:查询设备信息,抓包中常见于枚举阶段。0x00TEST UNIT READY:检测设备就绪状态。0x42UNMAP:通知设备回收无效块,常用于 TRIM 场景。
五、案例场景:一次 READ(10) 的完整抓包链路
假设主机发起一次 4KB 读取,抓包中应观察到如下序列:
- 主机发送 Command UPIU,Transaction Type=0x01,CDB Opcode=0x28,LBA=0x001000,长度=8 个逻辑块。
- 设备返回 Data IN UPIU,携带实际数据,Data Segment Length 与请求长度匹配。
- 设备返回 Response UPIU,Status=0x00 表示成功,Residual Transfer Count=0。
- 若 Status 非 0,需结合 Sense Data 判断是介质错误、非法 LBA 还是电源状态问题。
六、复盘:分层解析的检查清单
面对一段 UFS 抓包,建议按以下顺序逐层核对,避免跳层误判:
- 物理层:Lane 数量、速率等级、PWM/HS 切换点是否正常。
- UIC 层:链路启动、电源模式切换、属性读写是否完成。
- UniPro 层:UPIU 类型、Task Tag 关联、流控信用量是否异常。
- SCSI 层:CDB Opcode、LBA、传输长度、Status 与 Sense Data。
- 数据层:Data IN/OUT 长度与请求是否一致,有无残余计数。