硬件异常处理进入/退出代码存放在哪里
Where is hardware exception handling entry / exit code stored
我知道这个问题看起来很笼统,因为它可能取决于平台,
但我理解过程/函数调用,将 return 地址压入堆栈和局部变量等的汇编代码可以是调用函数或被调用函数的一部分。
当发生硬件异常或中断时,程序计数器将通过异常获取异常处理程序的地址table,但是存储状态的实际代码在哪里,return地址等。还是在硬件级别自动完成中断和异常?
提前致谢
对于在程序中明确定义的(同步)位置发生的函数调用,编译器生成可执行指令来管理 return 地址、寄存器和局部变量。这些说明与您的功能代码集成在一起。详细信息是特定于硬件和编译器的。
对于可以在程序中的任何位置(异步)发生的硬件异常或中断,管理 return 地址和寄存器都是在硬件中完成的。详细信息是特定于硬件的。
想想硬件 exception/interrupt 如何在程序执行期间的任何时候出现。然后考虑如果硬件 exception/interrupt 需要将特殊指令集成到可执行代码中,那么这些特殊指令将不得不在整个程序的任何地方重复。那没有意义。硬件 exception/interrupt 管理在硬件中处理。
由于您询问的是 arm 并且标记了微控制器,因此您可能在谈论 arm7tdmi,但可能在谈论 cortex-ms 之一。这些与全尺寸 arm 架构的工作方式不同。正如与这些核心(armv6-m 或 armv7-m 取决于核心)相关的体系结构参考手册中所记录的那样,它记录了硬件符合 ABI,以及中断的内容。所以 return 地址 psr 和寄存器 0 到 4 加上其他一些都放在堆栈上,这对于架构来说是不寻常的。 R14 不是获取 return 地址而是获取特定模式的无效地址,该模式是体系结构的一部分,与其他处理器 ip 不同,arm 鼓励或指定 cortex-ms 上的地址空间,这就是为什么你看到 ram 通常在这些上从 0x20000000 开始,而 flash 小于那个,有一些例外,他们将 ram 放在 "executable" 范围内假装是 harvard,而实际上修改了 harvard。这有助于 0xFFFxxxxx link 注册 return 地址,具体取决于手册,他们要么在 return 地址上 yada yada,要么详细说明您发现的模式的含义。
同样,矢量 table 中的地址拼写为前 16 个 system/arm 异常,然后是中断,最多可以有 128 或 256 个可能的中断,但是你必须查看芯片供应商(不是 arm)的文档,以了解它们暴露了多少以及与什么相关联。如果您不使用这些中断,则不必在闪存中为向量留下一个大洞,只需为您的程序使用该闪存(只要您确保永远不会触发该异常或中断)。
"code" 根本不是软件;根据定义,CPU 必须在内部自行执行,因为中断是异步发生的。 (或者对于由正在执行的指令引起的同步异常,则该指令的内部处理是有效触发它的原因)。
所以它是 CPU 内部的微代码或硬连线逻辑,它在异常时生成 return 地址的存储, 并执行任何其他事情该体系结构定义为发生异常/中断的一部分。
您可能还知道在 call
指令执行时推送 return 地址的代码在哪里,例如在 x86 上 the call
instruction pushes return info onto the stack 而不是覆盖 link 注册(大多数 RISC 的方式)。
我知道这个问题看起来很笼统,因为它可能取决于平台,
但我理解过程/函数调用,将 return 地址压入堆栈和局部变量等的汇编代码可以是调用函数或被调用函数的一部分。
当发生硬件异常或中断时,程序计数器将通过异常获取异常处理程序的地址table,但是存储状态的实际代码在哪里,return地址等。还是在硬件级别自动完成中断和异常?
提前致谢
对于在程序中明确定义的(同步)位置发生的函数调用,编译器生成可执行指令来管理 return 地址、寄存器和局部变量。这些说明与您的功能代码集成在一起。详细信息是特定于硬件和编译器的。
对于可以在程序中的任何位置(异步)发生的硬件异常或中断,管理 return 地址和寄存器都是在硬件中完成的。详细信息是特定于硬件的。
想想硬件 exception/interrupt 如何在程序执行期间的任何时候出现。然后考虑如果硬件 exception/interrupt 需要将特殊指令集成到可执行代码中,那么这些特殊指令将不得不在整个程序的任何地方重复。那没有意义。硬件 exception/interrupt 管理在硬件中处理。
由于您询问的是 arm 并且标记了微控制器,因此您可能在谈论 arm7tdmi,但可能在谈论 cortex-ms 之一。这些与全尺寸 arm 架构的工作方式不同。正如与这些核心(armv6-m 或 armv7-m 取决于核心)相关的体系结构参考手册中所记录的那样,它记录了硬件符合 ABI,以及中断的内容。所以 return 地址 psr 和寄存器 0 到 4 加上其他一些都放在堆栈上,这对于架构来说是不寻常的。 R14 不是获取 return 地址而是获取特定模式的无效地址,该模式是体系结构的一部分,与其他处理器 ip 不同,arm 鼓励或指定 cortex-ms 上的地址空间,这就是为什么你看到 ram 通常在这些上从 0x20000000 开始,而 flash 小于那个,有一些例外,他们将 ram 放在 "executable" 范围内假装是 harvard,而实际上修改了 harvard。这有助于 0xFFFxxxxx link 注册 return 地址,具体取决于手册,他们要么在 return 地址上 yada yada,要么详细说明您发现的模式的含义。
同样,矢量 table 中的地址拼写为前 16 个 system/arm 异常,然后是中断,最多可以有 128 或 256 个可能的中断,但是你必须查看芯片供应商(不是 arm)的文档,以了解它们暴露了多少以及与什么相关联。如果您不使用这些中断,则不必在闪存中为向量留下一个大洞,只需为您的程序使用该闪存(只要您确保永远不会触发该异常或中断)。
"code" 根本不是软件;根据定义,CPU 必须在内部自行执行,因为中断是异步发生的。 (或者对于由正在执行的指令引起的同步异常,则该指令的内部处理是有效触发它的原因)。
所以它是 CPU 内部的微代码或硬连线逻辑,它在异常时生成 return 地址的存储, 并执行任何其他事情该体系结构定义为发生异常/中断的一部分。
您可能还知道在 call
指令执行时推送 return 地址的代码在哪里,例如在 x86 上 the call
instruction pushes return info onto the stack 而不是覆盖 link 注册(大多数 RISC 的方式)。