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() 函数之前的写入操作在执行任何后续写入之前完成。
在其中一个 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() 函数之前的写入操作在执行任何后续写入之前完成。