【问题标题】:Why are the return addresses of prefetch abort and data abort different in ARM exceptions?为什么ARM异常中prefetch abort和data abort的返回地址不同?
【发布时间】:2019-04-28 23:01:08
【问题描述】:

对于预取,返回地址是: R14_abt = 中止指令的地址 + 4

对于数据中止,返回地址为: R14_abt = 中止指令的地址 + 8

【问题讨论】:

    标签: exception arm


    【解决方案1】:

    这些偏移是由于处理器的流水线和获取/解码/执行阶段造成的。

    处理器的程序计数器 (PC) 在执行期间的特定点更新。在获取/解码/执行的不同阶段可能会发生异常。

    在预取中止的情况下,指令不能(尚未)执行;仅当处理器实际尝试执行指令时才会发生异常(某些预取指令可能不会执行)。

    在数据中止的情况下,指令正在执行,指令的执行导致异常。

    来自 ARM 文档:

    关于预取中止:

    [预取中止异常] 发生在 处理器尝试执行 已预取的指令 非法地址,即 地址表示内存管理 子系统已确定是 处理器无法访问其 当前模式。

    ...已经在管道中的指令继续执行直到到达无效指令,此时会产生预取中止。

    ...因为在发出预取中止时程序计数器没有更新,lr_ABT 指向导致异常的指令之后的指令。处理程序必须返回到 lr_ABT – 4

    关于数据中止:

    [数据中止异常] 发生在 数据传输指令尝试 以非法方式加载或存储数据 地址。

    当加载或存储指令尝试访问内存时,程序计数器已​​更新。 lr_ABT 中存储的 (pc – 4) 值指向异常地址之外的第二条指令生成了。当 MMU 将适当的地址加载到物理内存中时,处理程序应该返回到原始的中止指令,以便可以再次尝试执行它。 因此返回地址比 lr_ABT 中的少两个字(8 个字节)

    也就是说,对于数据中止,处理程序必须返回到lr_ABT – 8(前面两个字/指令)

    【讨论】:

      【解决方案2】:

      我不记得看过官方的解释,但如果你仔细想想,这很合乎逻辑。

      让我们考虑这个例子:

      00000 INSN1 [PC = 08]
      00004 INSN2 [PC = 0C]
      00008 INSN3 [PC = 10]
      

      如果处理器无法获取INSN3,则中止发生在执行之前,因此PC值仍然是INSN2之一,即0C。

      如果在 INSN3 执行过程中发生数据中止,PC 值已经更新为 10。

      【讨论】:

        【解决方案3】:

        对于预取中止

        new_lr_value = if CPSR.T == ‘1’ then PC else PC-4
        

        对于数据中止

        new_lr_value = if CPSR.T == ‘1’ then PC+4 else PC;
        

        参考 TRM TakePrefetchAbortException() 和 TakeDataAbortException()

        【讨论】:

          猜你喜欢
          • 2010-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多