我正在使用一个嵌入式设备,它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
该版本没有
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.S
CONFIG_WORD_SIZE
,仅当is时才使用32
(即仅在 32 位平台上)。
您必须提供有关您的平台的更多详细信息。
- 我可以使用和复制在较新内核、旧内核中实现的函数并重建它,但是修改内核源代码没有意义,对吗?
修改内核源代码是非常有意义的,如果你需要。向后移植一些代码似乎可能是一个很好的理由......但我的感觉是,也许您缺少一些东西(也许在您的平台配置中?)。
- 您能建议一些解决方法来解决它吗?
如果您的驱动程序确实需要这些文件,并且由于某种原因内核没有提供它们,我建议您在驱动程序代码中(重新)实现您需要的文件,而不是尝试修补arch/powerpc/kernel/
.
- 我如何测试缓存是否无效或正确刷新?有什么方法可以读取用户空间中的缓存块吗?
抱歉,无法帮助您解决这个问题 - 也许您可以使用 JTAG 调试器?干杯!
穆雷...