设备驱动程序内存缓冲区处理器缓存问题



我有一个设备,它使用USB中的两个不同的批量通道发送图像数据和视频帧。

我的工作站处理器缓存有点大,足以容纳大约100个视频帧,没有任何问题,但不能容纳图像数据。

我对图像和视频数据使用相同的缓冲区,这个缓冲区大约有50个块,其中一个块的大小是1MB。视频帧来得很快,然后是图像帧。

我的问题是,在下面的secnario中是否存在内存损坏问题?有人谁知道处理器缓存可以帮助我。

  • 由于视频帧很小,写入视频帧的内存缓冲区中的页面几乎都在缓存中。由于视频数据是以流的形式出现的,所以它从未被清除
  • 但当图像数据到来时,将使用大面积的内存缓冲区,然后视频内存页将被清空。但计划刷新,但仍然没有写入物理内存
  • 现在图像数据已经写入内存,我在那里使用了volatile
  • 并且,当图像数据写入后刷新这些数据时,这些数据将被缓存刷新损坏

这会发生吗?所以我也将volatile应用于视频数据写入,这个问题看起来好像消失了。但我需要做一份报告,那么上述情况有可能发生吗?

注释是赠品:两个线程,volatile被误用为线程机制。

两个线程可以在两个CPU内核上运行。虽然内核通常共享内存,但它们通常不共享一级缓存。中间缓存各不相同。因此,在两个CPU内核上取消引用相同的指针可能会得到不同的结果。对于在线程之间正确共享的变量来说,这不是问题;编译器将使用正确的指令。但是关键字是正确地共享。

在这里,我们将讨论一个小问题,即您将问题标记为C和C++,因为这两种语言在线程化之前是分叉的,在这两种语文中都是标准化的。然而,这两种线程机制有意相似,因此编译器对可以(作为扩展)定义C线程和C++线程如何交互。您需要查阅您的文档。

libusb线程封装在您自己的代码中可能会更容易,这样您就可以在没有线程问题的情况下接收数据,然后将代码调度到您控制的其他线程。

回到你所看到的内存损坏:你可能看到的是一个线程正在写出它的内存视图,结果发现它的缓存中有过时的数据。如果您使用了类似互斥锁的东西,这些过时的数据就会被注意到并同步缓存。

最新更新