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

Linux 如何禁用内核模块中的缓存,linux,caching,kernel,dma,kmalloc,Linux,Caching,Kernel,Dma,Kmalloc,我目前正在尝试开发一个Linux驱动程序,以使用FPGA中开发的自定义模块。为此,我使用Xilinx Zynq SoC和Linux发行版,该发行版在2个ARM内核上运行,我的VHDL模块在FPGA部分实现,但这对于理解我的问题并不重要 我的FPGA模块直接写入RAM,我想用驱动程序读取它写入的内容,但由于高速缓存,我遇到了问题。驱动程序从缓存中读取数据,而不是从RAM中读取数据,因此它会读取较旧的数据 为了定义FPGA可以写入的内存空间,我使用了kmalloc函数。你知道我可以用来强制读取RAM

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

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

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

我看到了两个标志,这可能是我正在寻找的,但我真的不明白他们做什么:

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

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

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


谢谢你的帮助

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

我发现了函数dma_alloc_coherent(),它似乎正是我想要的

有关此功能的更多信息,请参见:

在这里: