||
NCQ(Native Command Queuing 本地命令队列)是SATA规范支持的一种新的功能,它是一种使硬盘内部优化工作负荷执行顺序,通过对内部队列中的命令进行重新排序实现智能数据管理,改善硬盘因机械部件而受到的各种性能制约,以发挥硬盘最高的效率、使延迟最小化。
NCQ命令具有连续发送,低延时,需批量处理等特性。
遇到的问题:
NCQ命令下发时,通常是以命令队列的方式下发,也就是发送一连串的NCQ命令,通常最多为32个,但每次下发并不能确定一个NCQ命令队列中包含几个要处理的命令。
接收每个NCQ命令后,要回D2H FIS;
要处理NCQ命令队列时,首先要回DMA SETUP FIS,每个命令执行完毕后要发送SET DEVICE BIT命令;
当遇到下列问题时,整个命令队列将会出现卡死现象:
1. 不确定HOST的NCQ命令队包含几个命令时,DEVICE要进行处理,回DMA SETUP FIS命令,
2. 此时正好有新的NCQ命令下发,HOST此时需要的是D2H FIS,而DEVICE 回的命令是DMA SETUP FIS.原有的NCQ命令队列被打乱,出现异常。
解决方法
由于NCQ的特殊性,因此其解析命令的路径与普通命令有区别,NCQ命令的解析需放置在ISR中,以保证能够及时的接收下一次到来的NCQ命令,并且不干扰正常命令处理流程,以及其他命令的执行。