ARM锁定寄存器写操作会使设备崩溃

时间:2011-03-01 05:23:33

标签: linux-kernel arm android-ndk cortex-a8 lockdown

我正在使用运行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));

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

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

1 个答案:

答案 0 :(得分:3)

如果你打算使用缓存锁定,那么你需要注意一个很长的清单。 ARM的信息中心提供了一些提示:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344i/Chdeghcb.html

特别是,确保禁用中断,并使适当的指令/数据无效。还要检查是否已启用读/写访问 - 即使您处于内核模式,它也可能不会。您需要确保您的代码不会在关键点跨越页面或缓存行。它的 非常难以正确 。您不能只设置一个缓存方式锁定并期望一切正常工作,而您无法在C中使用内联ASM来实现。

最糟糕的情况是,您最终会干扰L2缓存控制器的内部状态机,锁定错误的数据,防止数据完全缓存并导致所有内容中止,或者使代码不同步。这将解释崩溃。

此外,这只是实验还是您试图提升性能?对于精心设计的代码序列避免接触DRAM /总线非常有用,例如,如果你想关闭它(深度睡眠),但它通常不会取得性能。