如何禁用内核模块中的缓存内存

时间:2016-03-21 11:43:06

标签: linux caching kernel dma kmalloc

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

我的FPGA模块直接写入RAM,我想阅读它用驱动程序写的内容,但由于缓存内存,我遇到了问题。驱动程序从缓存而不是RAM读取,因此它读取旧数据。

要定义FPGA可以写入的存储空间,我使用kmalloc函数。你知道我是否可以使用强制读取RAM内存而不是缓存的标志吗?

我看到了两面可能正在寻找的旗帜,但我并不真正理解他们的所作所为:

__ GFP_COLD:请求缓存冷页面,而不是尝试返回缓存热页面。 - >我认为它只是强制使用一个尚未缓存的页面,但之后会缓存它。这是对的吗?

GFP_DMA:看起来我正在寻找exect我读它只会强制使用与DMA兼容的部分内存。

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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

我发现了函数dma_alloc_coherent(),它似乎正是我正在寻找的东西。

有关此功能的更多信息,请访问:

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

在这里:

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