刷新写组合缓冲区

Jac*_*ies 5 memory x86 x86-64 atomic

在 x86_64 CPU 上,我已将一些页表条目标记为写组合。这些页面由 PCIe BAR 支持。当我完成页面存储到内存后,如何刷新写组合缓冲区?直观上,似乎sfence(或mfence) 应该这样做,但我不确定是否能保证同花。英特尔手册对该sfence指令的说明如下:

在 SFENCE 指令之前对所有内存存储的处理器执行进行排序。处理器确保 SFENCE 之前的每个存储在 SFENCE 之后的任何存储变得全局可见之前都是全局可见的。SFENCE 指令根据内存存储、其他 SFENCE 指令、MFENCE 指令和任何序列化指令(例如 CPUID 指令)进行排序。它没有根据内存负载或 LFENCE 指令进行排序。

目前还不清楚“全球可见”是什么意思。这是否意味着 CPU 中的所有其他内核,或者是否意味着整个系统,包括 I/O 设备(在这种情况下需要刷新)?

或者,是clflush我想要的吗?

Jac*_*ies 3

在对另一个 StackOverflow 问题的回答中,Paul A. Clayton 引用了英特尔手册第 11.3 节中的以下内容:

如果 WC 缓冲区已部分填充,则写入可能会延迟到下一次发生串行化事件为止;例如,SFENCE 或 MFENCE 指令、CPUID 执行、对未缓存内存的读取或写入、中断发生或 LOCK 指令执行。

因此,英特尔保证 ansfence或 anmfence将刷新写入组合缓冲区。