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和付费死树版本的形式提供.