一、故事前传 在之前的文章中, 我们已经针对SATA相关内容进行了较为详细的解析,如果感兴趣的话,请见之前文章:
我们这里主要解析一下SATA NCQ(Native Command Queuing)原生指令序列的相关内容。
NCQ是SATA中的命令协议,允许同时在Drive中执行多个命令。 当用户的应用程序发送多条指令到用户的硬盘,NCQ可以优化完成这些指令的顺序,从而降低负荷达到提升性能的目的。 此外,SATA Spec中还定义了三个特殊的功能来加强NCQ的性能:
当Drive收到一个Command,是要将其重新排列?还是立即执行呢?这怎么区分呢? 不怕,SATA Spec定义了两个特殊的NCQ指令:
从上面Read FPMA Queued Inputs和Write FPMA Queued Inputs我们可以看到红色框里面有一个特别的5-bit参数TAG(bit3~bit7). 这个参数就代表了NCQ一次可以最多执行32个Commands(如下图红色框Command List)。 在Device端,当Queued Commands(最多32)中的一个write或者read准备好传输数据时,通过发送DMA setup FIS告知Host已准备好数据传输,其中要附带更新Tag Value(如下图红色框)。
在Device端,当Queued Commands执行完成后, 通过发送Set Device Bits FIS告知Host完成状态,此时SActive区域对应TAG的相关内容(最多32个Command)。 FPDMA Read Command(60h) Protocol如下: 我们抓取了一个FPDMA Read Command(60h)的SATA trace,如下图: 从上面的SATA trace我们可以得到:
FPDMA Write Command(61h) Protocol如下: 我们抓取了一个FPDMA Write Command(61h)的SATA trace,如下图: 从上面的SATA trace我们可以得到:
下面我们再看个完整的例子加深一下对NCQ的理解: 举例:Host向Device发送两个Read FPDMA Queued指令 针对这个例子,我们作两个假设: 假设1: 第一个Read FPDMA Queued指令 Tag=0; 第二个Read FPDMA Queued指令 Tag=5; 假设2: Device要先执行第二个指令(Tag=5), 然后在执行第一个指令(Tag=0) 上图中指令下发流程如下:
在假设2中,我们要求先执行第二个指令(Tag=5),那么,这个时候就需要NCQ对这两个指令重新排序,如下图红色框显示: NCQ对这个两个指令重新排序后,就开始执行依次这两个Read FPDMA Queued指令, 指令执行流程见前面介绍的“FPDMA Read Command(60h) Protocol”内容。 上图是执行Tag=5指令的示意图,下图为执行Tag=0指令的示意图: |
|