2015-05-14 84 views
4

在我看过wmb()多次的PCI DMA驱动程序之一中。 wmb()函数实际上做了什么? 某处被提及为“不伤人的圣水”。这个功能的目的是什么?什么是在Linux驱动程序中的wmb()

+4

也许这是一个“写内存障碍”? https://www.kernel.org/doc/Documentation/memory-barriers.txt – stakx

回答

11

Stakx对你的问题的评论已经指向full answer:的确是一个写内存屏障。

但是,如果你不是那么熟悉的概念,该文件可能无法提供关于“为什么”的足够信息。

让我们假设一个串行端口,在那里你必须写字节到某个地址。串行芯片将通过电线发送这些字节。 重要的是你不要搞乱写 - 他们必须保持秩序或一切都是乱码。

但以下是不够的:

*serial = 'h'; 
    *serial = 'e'; 
    *serial = 'l'; 
    *serial = 'l'; 
    *serial = 'o'; 

由于编译器,处理器,内存子系统以及它们之间的公共汽车被允许重新排序店为优化(相信我,是的,他们是和是, 他们是这样)。

所以你必须添加代码,以确保该商店不纠缠起来。 这就是wmb()宏所做的:防止商店重新排序。

请注意,只是使串行指针变得不稳定:虽然它确保编译器不会重新排序,但提到的其他机制仍然会造成严重破坏。这在another kernel doc piece中有记录。

对此事的很好看的是Paul McKenney's book,可作为免费的PDF和付费的死树的版本。

2

Wmb表示写入内存屏障。 它在编译的指令flow.its平台相关中插入硬件内存障碍。 该功能保证写入操作的顺序。 在执行任何后续写入之前,wmb()函数完成之前的写入操作完成。

相关问题