3

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

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

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

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

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

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

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

谢谢您的帮助 !

4

1 回答 1

3

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

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

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

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

和这里 :

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

于 2016-03-21T14:44:54.590 回答