内存防护在编译器级别和硬件级别

时间:2012-08-14 07:16:32

标签: c memory-barriers memory-fences

我读到有关内存屏障here的信息......我需要对它进行一些澄清

  

asm volatile(“”:::“memory”)

这提供了编译器级别的内存栅栏,处理器在使用时仍然可以进行重新排序。

无论如何,我可以用类似的指令实现编译器级别的防护和处理器级别的防护吗?

我遇到了,

  

asm volatile(“sfence”:::“memory”)

这是做什么的?它是否仅提供编译器级别存储防护?

对此的任何输入都将非常有用。

由于

1 个答案:

答案 0 :(得分:3)

他们执行两个与概念相关但功能不同的行为:

asm volatile ("" : : : "memory")

告诉编译器不要对该点周围的内存访问进行重新排序(否则可以自由地进行优化),这样就可以确保写入代码的加载和存储在命中时完成代码中的那一点。

asm volatile("sfence" : : : "memory")

是一个实际的intel-family cpu命令(sfence),它告诉硬件不要重新排序存储(还有lfence和mfence硬件指令)以进行优化;添加“memory”约束会告诉编译器不要重新排序内存访问。

维基百科对这个主题有一个很好的待遇(http://en.wikipedia.org/wiki/Memory_barrier);如果你想要更深入一点,你应该查看英特尔程序员手册(http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html/)