ARM体系结构中对异常中断的一些概述

优先级
| 异常中断类型 | 异常中断模式 | 优先级 |
|---|---|---|
| Rset | 特权模式 | 1 |
| Undef | 未定义指令中止模式 | 6 |
| SWI | 特权模式 | 6 |
| PAbort | 中止模式 | 5 |
| DAbort | 中止模式 | 2 |
| IRQ | 外部中断模式 | 4 |
| FIQ | 快速中断模式 | 3 |



- SWI或Undef:发生该异常时,PC值未更新,它指向当前指令后面的第2条指令,进入中断时,CPU将(
PC-4)保存到lr_mode中,(PC-4)指向的是当前指令的下一条指令;异常处理完后应返回当前指令的下一条指令;即MOV PC, LR - IRQ或FIQ:通常,CPU执行完当前指令后,查询系统是否允许IRQ及FIQ中断,以及是否产生IRQ及FIQ中断,当该异常中断产生时,PC值已更新,它指向当前指令的后3条指令,进入中断时,CPU将(
PC-4)保存到lr_mode中,(PC-4)指向的是当前指令后的第2条指令;异常处理完后应返回当前指令的下一条指令;即SUBS PC, LR, #4 - PAbort:指令预取中止异常;

ABC三条指令,在执行A时预取C,若C指令会产生异常则标记该指令,在执行指令C时,处理器产生指令预取中止异常中断;当发生PAbort时,程序要返回到该有问题的指令处,重新读取并执行该指令。因此PAbort中断程序应该返回到产生该指令预取中止异常中断的指令处,而不是像前面的返回到发生中断指令的下一条指令;
PAbort是由当前执行的指令自身产生的,当该异常产生时,PC值未更新,它指向当前指令后面的第2条指令,进入中断时,CPU将(PC-4)保存到lr_mode中,(PC-4)指向的是当前指令的下一条指令;异常处理完后应返回当前指令;即SUBS PC, LR, #4 - DAbort:数据访问中止异常;

DAbort是由数据访问指令产生的,当该异常产生时,PC值已更新,它指向当前指令后面的第3条指令,进入中断时,CPU将(PC-4)保存到lr_mode中,(PC-4)指向的是当前指令的第2条指令;异常处理完后应返回到产生数据访问中止异常中断的指令处;即SUBS PC, LR, #8
总结
| 异常类型 | 返回操作 |
|---|---|
| SWI or Undef | MOV PC, LR |
| IRQ or FIQ | SUBS PC, LR, #4 |
| PAbort | SUBS PC, LR, #4 |
| DAbort | SUBS PC, LR, #8 |
- 将
LR修改为中断处理完后的返回地址; STMFD sp!, {reglist, lr}// 保存现场,!表示更新sp的值;- 异常中断处理程序;
LDMFD SP!, {reglist, lr}^// 恢复现场,^表示将SPSR_mode寄存器的内容复制到当前程序状态寄存器CPSR中,该指令只能在特权模式下使用;
IROMBoot程序设置了这个表;


除了复位操作,其他几种异常会跳到 0xFFFF0000 + offset 的地址;
0xFFFF0000 是内部 SRAM 的起始地址;板子启动时IROM程序会将nsih.bin和2nboot.bin复制到0xFFFF0000处,下面是nsih.bin开头的部分代码;

也是几条跳转指令,0xFFFF0200是2nboot.bin的起始地址,再看看2nboot.bin的开头几条指令;

总结
友善Smart4418 官方安卓镜像的异常处理过程:
- 由
IROMBOOT程序设定异常向量表;
ARM CPU的异常处理程序应该挨个地存在0x0地址。通常将用户的异常处理程序存在于零地址。但是,在IROMBOOT的情况下,用户的异常处理程序不可能设置在0x0地址,因为ROM存在于0x0地址。当使用MMU时,可以通过将任意存储器映射到零地址来处理CPU异常。然而,IROBOOT提供了用于不使用MMU的系统重定向异常处理程序的功能。
- 当异常发生时,PC跳向
IROM(0x00000000 + offset)(IROM的地址是0x34000000,被映射到0x0); - 再跳向
nsih(0xFFFF0000 + offset); - 再跳向
2nboot(0xFFFF0200 + offset);
本文深入解析ARM体系结构中的七种异常中断类型,包括其优先级、模式及CPU响应过程。详细阐述了不同类型的异常如何影响程序计数器(PC)的值,以及异常处理后的返回操作。同时,探讨了异常向量表的设定及其在异常处理流程中的作用。

:异常中断处理概述&spm=1001.2101.3001.5002&articleId=82793888&d=1&t=3&u=03a1dfc4cbac495c85168473674500fc)
608

被折叠的 条评论
为什么被折叠?



