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

What is wmb() in linux driver

在其中一个 PCI DMA 驱动程序中,我多次看到 wmb()。 wmb() 函数实际上做了什么? 它在某处提到为 "holy water that doesn't hurts"。该功能的用途是什么?

Stakx 对您的问题的评论已经指出full answer:确实是写内存障碍。

但是如果您对这个概念不太熟悉,文档可能无法提供足够的信息 "why"。

让我们假设一个串口,你必须将字节写入某个地址。然后串行芯片将通过电线发送这些字节。 重要的是不要弄乱写入 - 它们必须保持有序,否则一切都是乱码。

但以下还不够:

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

因为允许编译器、处理器、内存子系统和它们之间的总线重新排序您的存储作为优化(相信我,是的,是的,它们确实如此)。

因此您必须添加代码以确保商店不会纠缠在一起。 这就是 wmb() 宏的作用:防止对商店重新排序。

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

有关此事的好书是 Paul McKenney's book,它有免费的 PDF 版本和付费的死树版本。

Wmb表示写内存屏障。 此函数在编译指令流中插入硬件内存屏障。它也依赖于平台。 此函数保证写入操作中的顺序。 wmb() 函数之前的写入操作在执行任何后续写入之前完成。