【问题标题】:Where is hardware exception handling entry / exit code stored硬件异常处理进入/退出代码存储在哪里
【发布时间】:2018-09-22 09:37:09
【问题描述】:

我知道这个问题似乎很笼统,因为它可能取决于平台,

但我了解过程/函数调用,将返回地址推送到堆栈和局部变量等的汇编代码可以是调用者函数或被调用者函数的一部分。

当发生硬件异常或中断时,程序计数器将通过异常表获取异常处理程序的地址,但存储状态、返回地址等的实际代码在哪里。或者这是在中断和异常的硬件级别?

提前致谢

【问题讨论】:

  • 有些架构不保存任何东西,有些只保存最小的上下文。当由 SW 完成时,代码是 ISR 的一部分。当由硬件完成时,它要么是硬连线的,要么是微程序的。
  • 但是至少必须保存返回地址?和状态寄存器可能吗?
  • 这太宽泛了,因为它是特定于架构的,您可以简单地在您拥有或应该拥有的此类开发文档中查找答案。最小值是返回地址,有些架构为此有一个隐藏堆栈,有些架构有备用寄存器组。并且一些架构扩展了为您保存状态字(标志等),或者可能为您以及 pc 和 psr 保存一些寄存器。您对哪种架构感兴趣,您不了解手册的哪些部分?
  • 例如,我会对 ARM 感兴趣。我主要想知道返回地址等是否通过与过程调用相同的软件指令保存,或者它通常是一种特殊情况,除了通过硬件自动保存的东西
  • 是的,必须保存返回地址。 IIRC 存在将返回地址保存在特定寄存器中的架构。但是你明白了,它是硬件做的,软件做的太晚了:)

标签: exception assembly microcontroller interrupt


【解决方案1】:

因为您询问的是 arm 并且标记了微控制器,所以您可能在谈论 arm7tdmi,但可能在谈论其中一个 cortex-ms。这些工作方式与全尺寸手臂架构不同。正如与这些内核相关的架构参考手册中所述(armv6-m 或 armv7-m 取决于内核),它记录了硬件符合 ABI,以及用于中断的内容。所以返回地址 psr 和寄存器 0 到 4 加上其他一些都放在堆栈上,这对于架构来说是不寻常的。 R14 没有得到返回地址,而是得到了一个特定模式的无效地址,这是架构的一部分,与其他处理器 ip 不同,ARM 鼓励或指定 cortex-ms 上的地址空间,这就是为什么你看到 ram 开始于0x20000000 通常在这些上,而 flash 小于那个,有一些例外情况是,当真正修改 harvard 时,它们将 ram 放置在假装是 harvard 的“可执行”范围内。这有助于 0xFFFxxxxx 链接寄存器返回地址,具体取决于手册,他们要么在返回地址上 yada yada,要么详细说明您发现的模式的含义。

同样,向量表中的地址被拼写为前 16 个是系统/臂异常,然后是中断,之后可能出现 128 或 256 个可能的中断,但您必须查看芯片供应商( not arm) 文档,以查看它们暴露了多少以及与什么相关联。如果您不使用这些中断,则不必在闪存中为向量留下一个大洞,只需将该闪存用于您的程序(只要您确保永远不会触发该异常或中断)。

【讨论】:

    【解决方案2】:

    对于在程序中定义明确的(同步)位置发生的函数调用,编译器会生成可执行指令来管理返回地址、寄存器和局部变量。这些说明与您的功能代码集成在一起。详细信息是特定于硬件和编译器的。

    对于可能发生在程序中任何位置(异步)的硬件异常或中断,管理返回地址和寄存器都是在硬件中完成的。详细信息因硬件而异。

    想想硬件异常/中断是如何在程序执行期间的任何时候发生的。然后考虑如果硬件异常/中断需要将特殊指令集成到可执行代码中,那么这些特殊指令将不得不在整个程序的任何地方重复。那没有意义。硬件异常/中断管理在硬件中处理。

    【讨论】:

    • 在某些架构上,硬件会保存所有寄存器。在其他情况下,它只保存程序计数器和处理器标志。其他只保存寄存器的子集,子集可以取决于中断类型。
    • 好的,谢谢。这几乎完全回答了我的问题:)
    【解决方案3】:

    “代码”根本不是软件;根据定义,CPU 必须自己在内部完成,因为中断是异步发生的。 (或者对于正在执行的指令引起的同步异常,那么该指令的内部处理就是有效触发它的原因)。

    因此,它是 CPU 内部的微代码或硬连线逻辑,它在异常时生成返回地址的存储,并执行架构定义为发生异常/中断的任何其他事情.

    您可能还想知道当call 指令执行时推送返回地址的代码在哪里,例如在x86 上the call instruction pushes return info onto the stack 而不是覆盖链接寄存器(大多数RISC 的做法)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2019-06-04
      • 2011-02-20
      相关资源
      最近更新 更多