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

埃尔多斯

在一种PCI DMA驱动程序中,我多次看到wmb()。wmb()函数实际上有什么作用?它在某处被称为“不会伤害的圣水”。该功能的目的是什么?

克拉斯·范·根德

Stakx对您的问题的评论已经指出了完整的答案:确实,这是一个写内存障碍。

但是,如果您不太熟悉该概念,则该文档可能无法提供有关“为什么”的足够信息。

假设有一个串行端口,您必须在其中向特定地址写入字节。然后,串行芯片将通过电线发送这些字节。那么重要的是,不要弄乱这些写入-它们必须保持顺序,否则所有内容都会出现乱码。

但是以下内容还不够:

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

因为允许编译器,处理器,内存子系统和两者之间的总线对存储进行重新排序以进行优化(请相信,是的,是的,它们确实如此)。

因此,您必须添加代码以确保商店不会混乱。这就是wmb()宏的主要功能:防止商店重新排序。

请注意,仅使串行指针具有可变性是不够的:虽然它确保编译器不会重新排序,但提到的其他机制仍然会造成严重破坏。另一个内核文档中对此进行了记录

保罗·麦肯尼Paul McKenney)的书对此事作了很好的阅读,可以免费获得PDF格式,也可以购买付费的枯树版本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章