2014-03-05 72 views
2

我有關於AHCI規範中的一個問題:AHCI規格

在端口變量pDmaXferCnt使用時,傳輸是DMA讀或寫?

規範中的描述似乎表明它不是,而是使用PRD代替。 但HBA如何知道要向SATA設備發送或從SATA設備接收多少數據? 這個信息將在H2D FIS的扇區數中可用,但除非我忽略它,否則似乎沒有變量的寄存器保存該值。 DX:transmit狀態也似乎表明,pDmaXferCnt將有一個設定值,但我不明白它將設置爲DMA讀/寫操作。

感謝

回答

0

從規格: 「實現注意: HBA狀態變量來描述所需要的外部可見行爲的實現有直接對應於這些變量的內部狀態值,不需要」 - 意思是你(也許)不會在寄存器中找到外部的pDmaXferCnt。

還有另一種方法來追蹤數量。

在AHCI規範的HBA存儲器空間使用部分下,存在命令列表(命令頭列表)和命令表(由命令頭指向的數據結構,每個命令表是被髮送)。這些都可以通過HBA訪問。

DW0中的命令頭是PRDTL--這是在傳輸中使用多少PRD的計數。

現在在命令頭指向的實際命令表中包含實際的PRD,在每個PRD中是它們自己的DBC或數據字節數(在DBA中指定的位置處要DMA'd的數據量(以字節爲單位) )。所以如果你把每個珠三角*都有自己的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