【问题标题】:ARM lockdown register write operation crashes the deviceARM 锁定寄存器写操作使设备崩溃
【发布时间】:2011-07-06 06:25:59
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 另外,找出您设备中核心的版本。检查 ARM 的网站以获取有关 Cortex A-8 版本的勘误表。有一个惊人的大勘误表,大部分是非用户可见的,但嘿,你正在玩这个系统:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多