c - 如何在PowerPC架构中 "invalidate"或 "flush"范围内的CPU缓存?

标签 c linux-kernel embedded cpu-cache powerpc

我正在使用一个嵌入式设备,该设备通过 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 的内核版本提供这些函数的声明。

现在我有一些问题:

  1. 我可以使用和复制在较新内核中实现的函数,在我的旧内核中并重建它,但修改内核源代码没有意义,对吧?
  2. 您能建议一些解决方法吗?
  3. 如何测试缓存是否已失效或正确刷新?有没有办法读取用户空间中的缓存 block ?

谢谢

最佳答案

是的,移植这些看起来很安全。它并不比 SDK 限制你的内核版本更疯狂。

没有简单的测试方法,当然不能从用户空间进行测试。依靠 dcbf、dcbst 等架构指令来做正确的事情是一个很好的假设。或者,为了进行测试,请查看内核中围绕 L1 缓存未命中的性能计数器。

关于c - 如何在PowerPC架构中 "invalidate"或 "flush"范围内的CPU缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58426975/

相关文章:

c - 在内核的包头中插入数据

c - 为什么 arm-none-eabi-size 报告 .data 部分为 0,即使我使用的是已初始化的 RAM?

没有malloc的C编程

c - 生成 RTE_Components.h

c - 在计算 (a*b)%c 时,a、b、c 的顺序为 (x) e+18 in c

c - "struct inside struct"中的限制

c - 多次声明相同的结构变量好吗?

C:同一个文件一个读指针,一个更新指针

python - 如何使用 Python 和 Linux 捕获 HID 输入?

linux - netlink套接字地址结构(nl_group)