什么是linux驱动程序中的wmb()

Abl*_*ose 4 linux-device-driver linux-kernel

在其中一个PCI DMA驱动程序中,我多次见过wmb().wmb()函数究竟做了什么?在某处,它被称为"不伤害的圣水".这个功能的目的是什么?

Kla*_*end 12

Stakx对你的问题的评论已经指出了完整的答案:实际上它是一个写内存屏障.

但是,如果您对该概念不太熟悉,该文档可能无法提供有关"为什么"的足够信息.

我们假设一个串行端口,您必须将字节写入某个地址.然后串行芯片将通过线路发送这些字节.因此,重要的是你不要搞砸写入 - 他们必须保持秩序或一切都是乱码.

但以下是不够的:

   *serial = 'h';
   *serial = 'e';
   *serial = 'l';
   *serial = 'l';
   *serial = 'o';
Run Code Online (Sandbox Code Playgroud)

因为编译器,处理器,内存子系统和它们之间的总线被允许重新排序你的商店作为优化(相信我,是的,是的,是的,他们这样做).

所以你必须添加代码,以确保商店不会纠结.除此之外,这就是wmb()宏的作用:防止商店的重新排序.

请注意,仅仅使串行指针易失性是不够的:虽然它确保编译器不会重新排序,但提到的其他机制仍然会造成严重破坏.这在另一个内核doc文档中有记录.

关于此事的一个很好的解读是Paul McKenney的书,以免费PDF和付费死树版本的形式提供.