AHCI规范

时间:2014-03-05 13:21:00

标签: linux sata

我对AHCI规范有疑问:

当传输是DMA写入还是读取时,端口中使用的变量pDmaXferCnt是什么?

规范中的描述似乎表明它不是,但改为使用PRD。 但是,HBA如何知道向SATA设备发送或接收多少数据? 这些信息将以H2D FIS的扇区数量提供,但除非我忽略了它,否则似乎没有一个包含该值的变量寄存器。 DX:transmit状态似乎也表明pDmaXferCnt将具有设定值,但我无法确定为DMA读/写操作设置的位置。

由于

1 个答案:

答案 0 :(得分:0)

从规格: "实施注意事项: HBA状态变量用于描述所需的外部可见行为。实现不需要具有直接对应于这些变量的内部状态值。" - 意味着你(也许)不会在寄存器中找到外部的pDmaXferCnt。

还有另一种方法可以跟踪计数。

在AHCI规范的HBA内存空间使用部分,有命令列表的数据结构(命令头列表)和命令表(由命令头指向,每个命令表是一个命令是发送)。这些都可供HBA访问。

在DW0的命令头中是PRDTL - 它是转移中使用的PRD数量的计数。

现在在命令头所指向的实际命令表中,包含实际的PRD,在每个PRD中是它们自己的DBC或数据字节计数(以字节为单位的数据量为DMA' d at DBA中指定的位置)。因此,如果您将每个PRD的*都放在自己的DBC中并添加它们,您将获得要传输的数据量。

或者在命令头中,DW1是PRDBC,它是传输的字节数,因此您可以在命令后检查。

HBA - 主机总线适配器

PRDTL - 物理区域描述符表长度

PRD - 物理区域描述符(跟踪物理内存中的位置和要传输的字节数)

DBC - 数据字节数(在PRD内)

DBA - 数据库地址(PRD内的物理地址)

PRDBC - 物理区域描述符字节数

DMA - 直接内存访问

更多阅读:http://www.intel.com/content/www/us/en/io/serial-ata/serial-ata-ahci-spec-rev1-3-1.html

enter image description here

enter image description here