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

Linux kernel linux驱动程序中的wmb()是什么,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,在其中一个PCI DMA驱动程序中,我多次看到wmb()。wmb()函数实际上做什么? 在某个地方,它被称为“不痛的圣水”。该函数的用途是什么?Stakx对您的问题的评论已经指出:它确实是一个写内存障碍 但是,如果您对这个概念不太熟悉,文档可能无法提供足够的“为什么”信息 让我们假设一个串行端口,您必须在其中向某个地址写入字节。然后,串行芯片将通过导线发送这些字节。 因此,重要的是不要弄乱书写——它们必须保持有序,否则一切都会乱七八糟 但以下是不够的: *serial = 'h';

在其中一个PCI DMA驱动程序中,我多次看到wmb()。wmb()函数实际上做什么?
在某个地方,它被称为“不痛的圣水”。该函数的用途是什么?

Stakx对您的问题的评论已经指出:它确实是一个写内存障碍

但是,如果您对这个概念不太熟悉,文档可能无法提供足够的“为什么”信息

让我们假设一个串行端口,您必须在其中向某个地址写入字节。然后,串行芯片将通过导线发送这些字节。 因此,重要的是不要弄乱书写——它们必须保持有序,否则一切都会乱七八糟

但以下是不够的:

   *serial = 'h';
   *serial = 'e';
   *serial = 'l';
   *serial = 'l';
   *serial = 'o';
因为编译器、处理器、内存子系统以及它们之间的总线都可以作为优化对存储进行重新排序(相信我,是的,是的,它们可以)

因此,您必须添加代码,以确保存储不会陷入混乱。 这就是wmb()宏所做的:防止存储的重新排序

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


关于这个问题的一个很好的读物是免费的PDF和付费的死树版本。

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

可能是“写入内存障碍”?