SATA协议体系:物理层、链路层、传输层、应用层简介

做SATA bring-up这些年,我最大的体会是:不懂协议体系,你连问题出在哪一层都搞不清楚。说白了,SATA协议就像一栋四层楼,从最底下的物理层,到顶上的应用层,每一层都有自己的规矩。

这里我先把四层结构摆出来,给各位一个全局认知。后面我们每一层都要单独讲,今天就先搭个框架。

SATA协议四层架构 应用层 ATA命令、NCQ、FPDMA、TRIM 传输层 FIS封装与拆解、流控、重传 链路层 8b/10b编码、CRC、原语握手 物理层 OOB信号、速率协商、链路初始化 💡 数据通路: 主机命令 → 应用层封装FIS → 传输层加帧头/帧尾 → 链路层编码+CRC → 物理层串行发送

2.1 物理层 — 信号的起跑线

物理层,说白了就是负责把主机和设备之间的电信号搞定。它管的是最底层的事情:怎么上电、怎么握手、怎么确定用多快的速度通信。

我记得刚开始调试SATA时,信号质量的观念还没有深入脑海。那时候遇到一个盘老是协商失败,死活上不了6Gbps。后来示波器一抓,才发现信号眼图已经糊成一团了。

物理层核心任务:

  • OOB(带外)信号:COMINIT、COMWAKE、COMRESET,这是链路建立的第一步
  • 速率协商:1.5Gbps、3Gbps、6Gbps三档,谁匹配谁说了算
  • Gen1/Gen2/Gen3:代际不同,电气参数差距很大

避坑指南:我曾经因为PCB走线阻抗不对,导致Gen3始终无法up。你想想看,物理层不过关,上面三层再牛也没用。所以bring-up的第一步,先确认信号是不是活着。

2.2 链路层 — 数据的搬运工

物理层把信号通路打通了,接下来链路层要干活。这一层负责的是可靠的数据传输,说白了就是确保发出去的"0"和"1"不会错乱。

链路层有几个关键机制,我简单列一下:

  • 8b/10b编码:每8位数据扩展成10位,保证直流平衡
  • 原语(Primitives):像"ALIGN"、"SYNC"、"HOLD"这些控制符号,用来做帧边界对齐和流控
  • CRC校验:32位循环冗余校验,查传输错误
  • 重传机制:发现错误就要求重发,链路层自己搞定

⚠️ 注意:链路层的原语对时序要求非常苛刻。我见过一个case,因为"SYNC"原语发得晚了几个时钟周期,整个链路上就疯狂报"CRC Error"。你排查链路层问题时,建议先抓原语时序。

2.3 传输层 — 消息的快递员

传输层做的事情,我习惯用快递来类比。它把应用层的一大段命令和数据,打包成一个个FIS(帧信息结构)。一个FIS就是一个快递包裹,包裹里有发件地址、收件地址、内容说明。

常见的FIS类型包括:

FIS类型 用途 方向
Register FIS - Host to Device 主机下发ATA命令 主机 → 设备
Register FIS - Device to Host 设备返回状态/错误 设备 → 主机
Data FIS 数据传输(读/写) 双向
DMA Activate FIS 设备通知主机准备DMA 设备 → 主机
Set Device Bits FIS 设备上报中断位图 设备 → 主机

传输层还负责流控和重发管理。如果设备来不及处理,它会通过原语让主机等一下,这就是流控。当链路层报CRC错误时,传输层会判断是否需要重传整个FIS。

2.4 应用层 — 命令的执行者

应用层是离软件最近的一层。我们在驱动里发出去的ATA命令,归根结底都是应用层的事情。

举个简单的例子:你想读一个LBA地址的数据。驱动拼好一个"Read DMA Ext"命令,应用层把这个命令打包成Register FIS,往下传递给传输层。然后设备收到后解析命令,找到数据,再打包成Data FIS回传。

应用层的关键点包括:

  • ATA命令集:读写、识别、安全擦除、SMART等等
  • NCQ(原生命令队列):支持32条命令同时排队
  • FPDMA:基于DMA的数据传输模式
  • TRIM:固态硬盘的垃圾回收优化命令

我个人的经验:bring-up阶段最容易出问题的是应用层,因为它依赖下面三层都正常。你明明物理层OK、链路层OK、FIS也能收发,但命令就是执行不下去。这时候我通常会拿逻辑分析仪抓一帧完整的命令交互,看寄存器值对不对。

2.5 四层之间的关系

四层协议不是各自为政的。它们之间有严格的封装关系和依赖关系。我给你画个图,你一看就明白了:

  • 应用层产生命令 → 交给传输层
  • 传输层封装成FIS → 交给链路层
  • 链路层加帧头/CRC/8b10b编码 → 交给物理层
  • 物理层串行化发送 → 通过SATA线缆传输
  • 接收端反过来:物理层串转并 → 链路层解码/校验 → 传输层拆FIS → 应用层执行

你想想看,哪一层出错,都可能让整个链路中断。有时候链路层报CRC错误,问题根源可能是物理层的信号抖动太大;有时候传输层FIS收不全,问题可能出在链路层的流控原语没发对。

⚠️ 重要提醒:bring-up一定要从物理层开始逐层往上排查。我曾经看到一个团队卡在"命令超时"上三天,最后发现是物理层速率协商到1.5Gbps就卡住了,根本没跑到3Gbps。应用层命令超时只是表象。

2.6 各层常见故障速查

这里我准备了一个对比表格,把各层常见的故障现象都列出来了。你以后遇到问题,可以先对照一下:

协议层 典型故障现象 排查方向
物理层 链路无法建立、速率协商失败、频繁断开 示波器抓眼图、查差分信号、测电压/摆率
链路层 CRC错误暴增、原语丢失、帧对齐失败 抓原语时序、查8b/10b违例
传输层 FIS收不到、流控卡死、重传次数过多 逻辑分析仪抓FIS交互、查流控状态机
应用层 命令超时、返回状态异常、数据不一致 抓ATA命令寄存器值、比对协议分析仪log