在所有情况下Dabt异常?

时间:2013-10-06 06:40:33

标签: embedded arm embedded-linux armv7

我正试图找到我观察的解释

a)假设PERIPHBASE位于0x2c000000且MMU被禁用。如果访问地址0x21000000会有DABT吗? 我有一个DABT

b)假设启用了MMU转换,并且仅使用1G块(Lpae)创建1:1映射。因此存在0x2100000的1:1映射。再次访问它会产生DABT。

c)启用MMU但包含0-1G的条目1标记为无效。访问0x21000000再次提供DABT。

如果您正在编写异常/陷阱处理程序,您如何识别(a)(b)(c)中的哪一个导致异常/陷阱。

需要输入,这里有点困惑......

2 个答案:

答案 0 :(得分:1)

实际上相当简单。

(a)我怀疑MMU被禁用时无法获得数据中止。据我所知,数据中止是MMU的一个属性。在任何情况下,SCTRL's bit 0都会告诉您MMU是启用还是禁用。

(b)和(c)使用DFSR,您可以区分这些情况。如果在映射存在时发生数据中止,则很可能是权限错误。否则,它只是一个翻译错误。

答案 1 :(得分:1)

PERIPHBASE与这个问题无关。

有两种基本类型的数据中止(DABT):

  • 内部(由MMU生成)
  • 外部(由互连或从设备返回)

因此对于(a),只能进行外部中止(MMU只会在启用时触发中止)。

(b)鉴于我们知道尝试访问给定地址的外设的行为将导致中止,因此MMU上的中止和有效映射很可能也是外部中止。但在这种情况下,任何一种情况都是可能的(即使映射有效,对齐检查也可能产生内部中止)。

(c)如果MMU打开且映射无效,则不会进行外部访问 - 因此这将是内部中止。

正如Jitesh指出的那样,数据故障状态寄存器(DFSR)可以为您提供有关故障的信息。故障状态字段将通知您访问如何失败,如果中止是外部的,ExT位将通知您故障是由互连生成(DECERR)还是来自从设备(SLVERR)的错误响应。 / p>