如何在内核模块中禁用高速缓存

How to disable cache memory in kernel modules

我目前正在尝试开发一个 Linux 驱动程序以使用在 FPGA 中开发的自定义模块。为此,我使用 Xilinx Zynq SoC,其 Linux 分布在 2 个 ARM 内核上运行,我的 VHDL 模块在 FPGA 部分实现,但这对于理解我的问题并不重要。

我的FPGA模块是直接写RAM的,我想用驱动读取它写的东西,但是因为缓存内存有问题。驱动程序从缓存中读取而不是从 RAM 中读取,因此它读取的是较旧的数据。

为了定义FPGA可以写入的内存space,我使用了kmalloc函数。你知道我可以用来强制从 RAM 内存而不是缓存读取的标志是否存在吗?

我看到了 2 个可能是我正在寻找的标志,但我不太明白它们的作用:

__GFP_COLD :请​​求缓存冷页面而不是尝试 return 缓存热页面。 --> 我认为它只是强制使用尚未缓存的页面,但随后会缓存它。对吗?

GFP_DMA : 好像是我要找的 exect 我看了它只强制使用与 DMA 兼容的内存的一部分。

如何禁用对使用 kmalloc 创建的数组的缓存?或者至少我如何强制处理器从 RAM 中读取而不是从缓存中读取?

感谢您的帮助!

我想我今天早上找到了我要找的东西。

我发现了函数 dma_alloc_coherent(),它似乎完全符合我的要求。

有关此功能的更多信息可在此处找到:

https://www.kernel.org/doc/Documentation/DMA-API.txt

这里:

https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt.