如何在内核模块中禁用高速缓存
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
这里:
我目前正在尝试开发一个 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
这里: