2

我正在使用运行 Linux 内核的 ARM Cortex A-8 设备进行一些实验。

我可以毫无问题地访问和读取 L2 缓存锁定寄存器的值:

asm volatile ("mrc p15, 1, %0, c9, c0, 0" : "=r" (i));

当我尝试写回该值时,设备立即崩溃:

asm volatile ("mcr p15, 1, %0, c9, c0, 0" : : "r" (i));

该代码作为内核模块运行,因此没有权限问题。

我想知道在写那个寄存器值之前我是否遗漏了什么特别的东西?

4

1 回答 1

3

如果您要使用缓存锁定,您需要注意一个很长的清单。ARM的信息中心有几个tips: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344i/ Chdeghcb.html

特别是,确保您已禁用中断,并使适当的指令/数据无效。还要检查是否启用了读/写访问 - 即使您处于内核模式也可能没有。您需要确保您的代码不会在关键点跨越页面或缓存行。做对真的很棘手。您不能只设置一个缓存方式锁定并期望一切正常,也不能只使用 C 中的内联 ASM 来做到这一点。

在最坏的情况下,您最终会阻塞 L2 缓存控制器的内部状态机,锁定错误的数据,完全阻止数据缓存并导致一切中止,或者使标签不同步。这将解释崩溃。

另外,这只是实验还是您想提高性能?对于精心设计的代码序列避免接触 DRAM/总线很有用,例如,如果您想将其关闭(深度睡眠),但这通常不会带来性能上的提升。

于 2011-03-01T07:50:30.420 回答