ENQCMD
和MOVDIR64B
是Intel DSA中的两条指令.
MOVDIR64B
从源内存地址读取64字节,并对目标地址执行64字节直接存储操作.ENQCMD
指令允许软件将命令写入排队寄存器,这些寄存器是使用内存映射I/O(MMIO)访问的特殊设备寄存器.
我的问题是——设计这两个指令的目的是什么?
根据我的理解,设置内存映射IO区域(寄存器)需要操作系统支持,即设备驱动程序.设置MMIO区域后,我们可以使用write()
系统调用访问它,这也在设备驱动程序中实现.对于一般架构,Linux支持iowrite64()
一次写入8字节的值.因此,如果我们想写64个字节,需要调用iowrite64()
8次.
在MOVDIR64B
的帮助下,为Intel DSA创建了一个new API-__iowrite512()
,它以原子方式写入64字节.
我同意后一种方法至少比前一种方法更有效,但我对传输数据所需的时间感到困惑.
考虑以下情况:如果给我们一个支持MOVDIR64B
和ENQCMD
的设备(Intel DSA),假设我们要将64字节的数据从内存传输到MMIO寄存器.有两个选项:iowrite64()
8次(使用循环);或__iowrite512()
次.后一个会比前一个快8倍吗?
我的 idea 是,相差8倍的可能性较小,但后者会更快.我可以知道速度有多快吗?是否在任何地方记录?我没有Intel DSA,因此我不确定如何测试它.
此外,ENQCMD
还有什么其他好处?它会被分解成几个微操作吗?如果是,那么哪些微操作可以执行ENQCMD
?