在我的代码中,我需要将代码中的写入一直推送到DIMM或DDR设备。我的要求是确保写入到达DIMM上的DDR设备的行,禁止,列。我需要阅读我写给主内存的内容。我不希望缓存让我获得价值。而是在写完之后我想从主存储器(DIMM)中获取此值。
到目前为止,我一直在使用英特尔的x86指令 wbinvd (写回和无效缓存)。但是这意味着缓存和TLB被刷新。回写请求转到主存储器。 但是,这些数据可能存在于内存控制器的写入缓冲区中的合理时间量(英特尔称其为集成内存控制器或IMC)。内存控制器 可能需要更多时间,具体取决于在内存控制器中运行的算法来处理写入。
有没有办法强制将内存控制器的写缓冲区中的所有现有或挂起写入写入DRAM设备?
我正在寻找的是比wbinvd更直接,更低级的东西。如果你能指出我正确的文件或描述这个的规格,我将不胜感激。
通常,IMC有几个可以写入或读取的寄存器。通过查看芯片组的规格,我找不到任何有用的东西。
感谢您花时间阅读本文。
答案 0 :(得分:1)
这就是英特尔为该集添加CLWB指令的原因。在写这个答案的那一刻,没有现成的硬件可以实现指令(AFAIK)。出于类似的原因,ARMv8.2-A添加了“DC CVAP”(通过虚拟地址清除数据缓存到持久性点)指令。
但是,没有架构方法来刷新IMC中的交易。 NVDIMM规范关注此问题并提供NVDIMM特定的机制以确保写入已到达设备。请参阅最近的ACPI规范中NVDIMM固件接口表中的Flush Hint地址结构说明。