在其中一个PCI DMA驱动程序中,我多次见过wmb()。 wmb()函数究竟做了什么? 在某处,它被称为“不伤害的圣水”。这个功能的目的是什么?
答案 0 :(得分:12)
Stakx对你的问题的评论已经指向full answer:它确实是一个写内存障碍。
但如果你对这个概念不太熟悉,那么该文件可能无法提供有关“为什么”的足够信息。
我们假设一个串行端口,您必须将字节写入某个地址。然后串行芯片将通过线路发送这些字节。 因此,重要的是你不要弄乱写入 - 他们必须保持秩序或一切都是乱码。
但以下是不够的:
*serial = 'h';
*serial = 'e';
*serial = 'l';
*serial = 'l';
*serial = 'o';
因为允许编译器,处理器,内存子系统和中间的总线重新排序你的商店作为优化(相信我,是的,是的,是的,他们这样做)。
所以你必须添加代码,以确保商店不会纠结。 除此之外,这就是wmb()宏的作用:防止商店的重新排序。
请注意,仅仅使串行指针易失性是不够的:虽然它确保编译器不会重新排序,但提到的其他机制仍然会造成严重破坏。这在another kernel doc piece中有记录。
关于此事的一个很好的解读是Paul McKenney's book,可以免费PDF格式和付费死树版本获得。
答案 1 :(得分:2)
Wmb意味着写内存障碍。 它在编译的指令flow.its平台中插入硬件内存屏障。 此功能保证了写操作的顺序。 wmb()函数之前的写操作在执行任何后续写操作之前完成。