如何在powerpc architecutre中“无效”或“刷新”一系列CPU缓存?

如何在powerpc architecutre中“无效”或“刷新”一系列CPU缓存?

我正在使用一个嵌入式设备,它PowerPC通过 PCIe 与我的 CPU 进行通信。由于 SDK 的限制,我必须使用 Linux 内核版本4.1.8。该版本没有cache与 中的操作相关的功能$KERNEL_SOURCE/arch/powerpc/include/asm/,例如:

  • "invalidate_dcache_range()"
  • "flush_dcache_range()"
  • "clean_dcache_range()"

(在此目录"cacheflush.h"头中仅包含上述函数的声明。)
此外,我的嵌入式设备的 SDK 需要调用这些函数来准备DMA访问。
请注意,高于此版本的内核版本4.5提供了这些函数的声明。

现在我有一些问题:

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

谢谢,

答案1

该版本没有cache与 中的操作相关的功能$KERNEL_SOURCE/arch/powerpc/include/asm/,例如:

  • "invalidate_dcache_range()"
  • "flush_dcache_range()"
  • "clean_dcache_range()"

(在此目录"cacheflush.h"头中仅包含上述函数的声明。)

内核版本 4.1.8 有这些函数 - 它们定义在arch/powerpc/kernel/misc_32.SCONFIG_WORD_SIZE,仅当is时才使用32(即仅在 32 位平台上)。

您必须提供有关您的平台的更多详细信息。

  1. 我可以使用和复制在较新内核、旧内核中实现的函数并重建它,但是修改内核源代码没有意义,对吗?

修改内核源代码是非常有意义的,如果你需要。向后移植一些代码似乎可能是一个很好的理由......但我的感觉是,也许您缺少一些东西(也许在您的平台配置中?)。

  1. 您能建议一些解决方法来解决它吗?

如果您的驱动程序确实需要这些文件,并且由于某种原因内核没有提供它们,我建议您在驱动程序代码中(重新)实现您需要的文件,而不是尝试修补arch/powerpc/kernel/.

  1. 我如何测试缓存是否无效或正确刷新?有什么方法可以读取用户空间中的缓存块吗?

抱歉,无法帮助您解决这个问题 - 也许您可以使用 JTAG 调试器?干杯!

穆雷...

相关内容