Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux AHCI规范_Linux_Sata - Fatal编程技术网

Linux AHCI规范

Linux AHCI规范,linux,sata,Linux,Sata,我对AHCI规范有一个问题: 当传输是DMA写入或读取时,端口中是否使用变量pDmaXferCnt 规范中的描述似乎表明它不是,但使用了PRD。 但是HBA如何知道要向SATA设备发送或从SATA设备接收多少数据? 该信息将在H2D FIS的扇区计数中可用,但除非我忽略了它,否则似乎没有保存该值的变量寄存器。 DX:transmit状态似乎也表明pDmaXferCnt将有一个设置值,但我看不出它将在哪里为DMA读/写操作设置 感谢《规格说明书》: “执行说明: HBA状态变量用于描述所需的外部可

我对AHCI规范有一个问题:

当传输是DMA写入或读取时,端口中是否使用变量
pDmaXferCnt

规范中的描述似乎表明它不是,但使用了PRD。 但是HBA如何知道要向SATA设备发送或从SATA设备接收多少数据? 该信息将在H2D FIS的扇区计数中可用,但除非我忽略了它,否则似乎没有保存该值的变量寄存器。
DX:transmit
状态似乎也表明
pDmaXferCnt
将有一个设置值,但我看不出它将在哪里为DMA读/写操作设置

感谢《规格说明书》

: “执行说明: HBA状态变量用于描述所需的外部可见行为。实现不需要具有直接对应于这些变量的内部状态值。“-意味着您(可能)无法在寄存器外部找到pDmaXferCnt

不过,还有另一种方法可以跟踪计数

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

DW0中的命令头中是PRDTL,它是传输中要使用多少PRD的计数

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

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

HBA-主机总线适配器

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

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

DBC-数据字节计数(PRD内部)

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

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

直接存储器存取

更多阅读: