我目前正在阅读/学习 ARM 架构……我想知道为什么有这么多模式(FIQ、用户、系统、主管、IRQ……)。
我的问题是为什么我们需要这么多模式?仅仅用户和系统还不够吗?
提前致谢。
这只是一个架构决定。多种模式的最大优点是它们有一些存储寄存器。这些额外的寄存器允许您编写简单得多的异常例程。
如果您只选择两个,那么只有 USR 和 SYS 可能是一个不错的选择,但是当您例外时会发生什么?正常的 ARM 模型是进入异常模式,将该异常模式的 banked 链接寄存器设置为指向解决异常后要返回的指令,将处理器状态保存在异常模式的 SPSR 寄存器中,然后跳转到异常向量。USR 和 SYS 共享它们所有的寄存器 - 使用这个模型,你会在每次中断时删除你的函数返回地址(在 LR 中)!
特别是 FIQ 模式比其他异常模式具有更多的存储寄存器。这些额外的寄存器与 FIQ 的“F”部分保持一致——它代表“Fast”。不必在软件中保存和恢复更多处理器上下文将加快您的中断处理程序。
没有太多可以添加到卡尔的答案中。不确定您在谈论什么系列/架构的 ARM 处理器,所以我将根据您的问题(FIQ、IRQ 等)假设您在谈论 ARM7/9/11。我不会列举每种 ARM 架构变体中每种模式之间的所有差异。
除了 Carl 所说的之外,针对不同情况采用不同模式的其他一些优势:
例如,在 FIQ 中,您不必立即分支,您可以继续执行。除了其他例外,您必须立即分支
使用不同的模式,您自然会支持单独的堆栈。如果您正在执行多任务处理(例如 RTOS)并且在处于中断模式时没有单独的堆栈,则必须在每个任务堆栈上构建额外的空间以应对最坏的中断情况
对于不同的模式,某些寄存器(例如 CPSR、MMU regs 等 - 取决于架构)是禁止使用的。与某些说明相同。您不想让用户代码修改特权寄存器,是吗?