c - 刷新写入内存 Controller 的缓冲区到 DDR 设备

标签 c memory x86 hardware intel

在我的代码中的某个时刻,我需要将代码中的写入一直推送到 DIMM 或 DDR 设备。我的要求是确保写入到达 DIMM 上 DDR 设备的行、禁止、列。我需要读取我写入主内存的内容。我不希望缓存让我获得值(value)。相反,在写入之后,我想从主内存(DIMM)中获取这个值。

到目前为止,我一直在使用 Intel 的 x86 指令 wbinvd(写回并使缓存失效)。然而,这意味着缓存和 TLB 被刷新。回写请求进入主存储器。 但是,此数据可能会在内存 Controller (英特尔称之为集成内存 Controller 或 IMC)的写入缓冲区中驻留一段合理的时间。内存 Controller 可能需要更多时间,具体取决于内存 Controller 中运行的处理写入的算法。

有没有办法将内存 Controller 的写入缓冲区中的所有现有或未决写入强制写入 DRAM 设备??

我正在寻找的是比 wbinvd 更直接、更底层的东西。如果您能指出正确的文档或规范来描述这一点,我将不胜感激。

通常,IMC 有几个可以写入或读取的寄存器。通过查看芯片组的规范,我找不到任何有用的信息。

感谢您花时间阅读本文。

最佳答案

这就是为什么英特尔将 CLWB 指令添加到集合中的原因。在写这个答案的时候,没有现成的可用硬件来实现指令(AFAIK)。出于类似的原因,ARMv8.2-A增加了“DC CVAP”(Clean data cache by virtual address to Point of Persistence)指令。

仍然没有架构方法来刷新 IMC 中的交易。 NVDIMM 规范关心这个问题并提供 NVDIMM 特定的机制来确保写入已到达设备。参见最新ACPI规范中NVDIMM固件接口(interface)表中Flush Hint Address Structure的描述。

关于c - 刷新写入内存 Controller 的缓冲区到 DDR 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23963219/

相关文章:

linux - 从堆栈写入字符的汇编程序

assembly - MOV r/m8,r8 和 MOV r8,r/m8 的区别

c++ - 将 C++ 对象(尤其是 STL 容器)移动到特定的内存位置

assembly - 用于设置奇偶校验、溢出和符号标志的 x86 指令

c - 如何使用 PAM 功能模块将功能授予特定用户和可执行文件?

c - inotify 无法对 IN_DELETE 使用react

c++ - 类成员中 T[n] 与 T* 样式数组的含义

改变c中分配内存的维数

c - C 中的指针和动态内存分配

c - 在C中,将指向字符串的指针从函数传递到主函数的正确方法是什么