Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel linux设备驱动程序中的未知符号刷新\u缓存\u范围_Linux Kernel_Linux Device Driver - Fatal编程技术网

Linux kernel linux设备驱动程序中的未知符号刷新\u缓存\u范围

Linux kernel linux设备驱动程序中的未知符号刷新\u缓存\u范围,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我正在编写我的第一个linux设备驱动程序,我遇到了一个问题。我想防止缓存一个内存区域,因此我一直在尝试使用刷新缓存范围()和刷新tlb范围()来刷新该内存区域的缓存。一切都可以很好地编译,但当我尝试加载内核模块时,会出现以下错误: Unknown symbol flush_cache_range (err 0) Unknown symbol flush_tlb_range (err 0) 我觉得这很奇怪。它们不应该在内核中定义吗 我知道我也可以使用dma\u alloc\u coherent

我正在编写我的第一个linux设备驱动程序,我遇到了一个问题。我想防止缓存一个内存区域,因此我一直在尝试使用
刷新缓存范围()
刷新tlb范围()
来刷新该内存区域的缓存。一切都可以很好地编译,但当我尝试加载内核模块时,会出现以下错误:

Unknown symbol flush_cache_range (err 0)
Unknown symbol flush_tlb_range (err 0)
我觉得这很奇怪。它们不应该在内核中定义吗

我知道我也可以使用
dma\u alloc\u coherent()
来分配非缓存内存区域。但是我没有设备结构,并且为这个参数传递NULL不会导致任何错误,但是我也看不到应该存在的任何数据

关于我的系统的一些信息:我正试图让它在带有集成FPGA(Xilinx Zynq)的ARM微控制器上运行。FPGA将一些数据复制到CPU指定的内存位置。现在我想访问这个内存,而不从缓存中获取旧数据


非常感谢您的帮助。

您不能使用诸如刷新缓存范围()之类的函数。,因为模块不打算使用这些函数

要分配DMA设备可以访问的内存,必须使用
DMA\u alloc\u coherent()
。 这需要一个有效的设备结构,以便它能够在内存地址和总线地址之间进行正确的映射

如果设备不在由现有框架(如PCI)处理的总线上,则必须创建平台设备。

注意:

1-刷新缓存范围不会“阻止缓存一个内存区域”。。它只是简单地刷新(清除+失效)缓存。将来通过同一虚拟范围对此内存区域的任何写入/读取都将再次通过缓存

2-如果FPGA正在写入内存,然后CPU将从内存中读取,那么刷新缓存可能不是正确的做法。通常,您需要做的是使内存区域无效,然后告诉FPGA进行写入


3-请查看内核源代码中的“${kernel src}/Documentation/DMA-API.txt”。它有很多关于如何安全地(缓存维护+物理到物理dma转换)使用dma的特定内存区域的信息。

谢谢,我想我终于让它运行了,即使没有设备结构。当为设备传递空指针时,它似乎确实起作用。我的问题其实在别的地方。