我正在使用一个嵌入式设备,该设备通过 PCIe 与我的 PowerPC
CPU 进行通信。由于 SDK 的限制,我必须使用 Linux 内核版本 4.1.8
。该版本没有$KERNEL_SOURCE/arch/powerpc/include/asm/
中与cache
操作相关的功能,例如:
“invalidate_dcache_range()”
“flush_dcache_range()”
“clean_dcache_range()”
(在此目录中“cacheflush.h”
header 仅包含上述函数的声明。)
此外,我的嵌入式设备的 SDK 需要调用这些函数来准备 DMA
访问。
请注意,高于 4.5
的内核版本提供这些函数的声明。
现在我有一些问题:
- 我可以使用和复制在较新内核中实现的函数,在我的旧内核中并重建它,但修改内核源代码没有意义,对吧?
- 您能建议一些解决方法吗?
- 如何测试缓存是否已失效或正确刷新?有没有办法读取用户空间中的缓存 block ?
谢谢
最佳答案
是的,移植这些看起来很安全。它并不比 SDK 限制你的内核版本更疯狂。
没有简单的测试方法,当然不能从用户空间进行测试。依靠 dcbf、dcbst 等架构指令来做正确的事情是一个很好的假设。或者,为了进行测试,请查看内核中围绕 L1 缓存未命中的性能计数器。
关于c - 如何在PowerPC架构中 "invalidate"或 "flush"范围内的CPU缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58426975/