2011-03-01 87 views
2

我正在对运行Linux内核的ARM Cortex A-8设备进行一些实验。ARM锁定寄存器写操作使设备崩溃

我可以访问和没有任何问题读L2高速缓存锁定寄存器的值:

ASM易失性( “MRC P15,1,%0,C9,C0,0”: “= R”(I ));

当我尝试的值写回,该装置立即崩溃:

ASM易失性( “MCR P15,1,%0,C9,C0,0”: “R”(I));

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

我不知道在写这个寄存器值之前我是否缺少什么特别的东西?

回答

3

有一个很长的清单,你需要小心,如果你打算玩高速缓存锁定。 ARM的信息中心有一些提示:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344i/Chdeghcb.html

特别是,确保您的中断被禁用,并且适当的指令/数据无效。同时检查是否启用了读/写访问 - 即使您处于内核模式,也可能不会。您需要确保您的代码不会跨越关键点的页面或缓存行。这是真的很难得到正确的。你不能只是设置一个缓存方式锁定,并期望一切工作,并且你不能只使用C中的内联ASM来完成它。

最糟糕的情况下,你最终会干扰内部状态机L2高速缓存控制器,锁定错误数据,阻止数据完全缓存并导致所有内容中止,或使标签不同步。这将解释崩溃。

此外,这只是试验或你是否想提高性能?如果你想关闭它(深度睡眠),这对于避免触摸DRAM /总线来制作精心设计的代码序列非常有用,但它通常不会取得成功。

+0

此外,找出您的设备中的核心修订。查看ARM的网站,查找Cortex A-8的修订版。有一个惊人的大勘误,大部分是非用户可见的,但嘿,你正在玩这个系统:) – 2011-03-01 07:53:29