以下代码来自
include/asm-i386/io.h
,并且被从dma_map_single()
调用。我的理解是flush_write_buffers()
在DMA映射内存之前会清空CPU内存缓存。但是这个汇编代码是如何清空CPU缓存的呢?static inline void flush_write_buffers(void)
{
__asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory");
}
flush_write_buffers
的作用,而不是带锁前缀的指令,这两个问题本质上有着不同的答案。但除此之外,还有几个不准确的陈述。最大的问题是“选择锁加指令只是出于性能原因...” 不仅这一点太不准确了,而且也不相关,因为在需要flush_write_buffers
的处理器上不支持mfence
。 - Hadi Braislock add...
,那么值得一提的是,x += 0
不会修改x
,而0(%esp)
是“栈顶”,很可能已经在L1d缓存中独占所有权,并且不与任何其他核心共享。也许其中一个链接已经涵盖了这一点,但总结一下也无妨。 - Peter Cordes0(%esp)
始终是可写的,因此选择它是安全的,通常也很有效。 - Peter Cordes