【问题标题】:How to "invalidate" or "flush" a range of CPU cache in PowerPC architecture?如何在 PowerPC 架构中“无效”或“刷新”一系列 CPU 缓存?
【发布时间】:2020-02-14 00:59:40
【问题描述】:

我正在使用通过 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" 标头仅包含上述函数的声明。)
另外,我的嵌入式设备的SDK需要调用这些函数来准备DMA访问。
请注意,高于4.5 的内核版本提供了这些函数的声明。

现在我有一些问题:

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

谢谢,

【问题讨论】:

    标签: c linux-kernel embedded cpu-cache powerpc


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢@danblack。我已经更改了 SDK 源代码,内核已经完好无损。我直接使用__asm__ 使用汇编指令!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 2015-11-28
    相关资源
    最近更新 更多