ARM中断体系结构
ARM中断体系结构
一、什么是“中断”?
举个例子,我正在看电视,突然感到肚子疼,想要上大号,这时我就得暂停电视,起身去上厕所啊,上完大号了,人也舒服了,我就回来播放电视继续看。 看电视过程中,突然被打断去完成上厕所这件事,就可以理解为一个中断。说的再通俗一些,你拉的那泡“粑粑”,就是一个中断事件😂。
对于计算机也类似,当CPU在正常执行程序时,突然来了另外的一个紧急事件,这是CPU就得停下正在执行的程序,去完成紧急事件,当完成紧急事件后,再继续执行原本的程序。
中断触发类型
中断事件的触发包括2种类型,硬件触发和软件触发。
打个比方,感到肚子疼进而想上大号,可以是被锤了一拳肚子疼(外部硬件触发),也可以是吃坏了东西肚子疼(内部软件触发)。
中断优先级
还是举这个例子,我正在看电视,突然想上大号,这时刚好又有人敲门,而且桌子上的电话还响了,同时产生了3个中断事件,那么我应该怎么办呢? 当然是按照事情的优先级逐个处理, 先开门把人接进来,然后拿上桌子上的电话,接着去卫生间上大号。
对于计算机也一样,当同时产生多个中断事件,CPU也是按照预先规定的优先级逐个处理。
同时产生多个中断事件时,需要按优先级处理,这个很好理解,但需要注意另一种情况,当你正在处理一个中断事件时,接着又来了其它中断事件,也需要按优先级处理。
ARM处理器的7种中断类型
首先,从名次定义的角度说,中断≈异常。
一件事干的好好的,突然被打断了,能不是一种”异常“吗?
如果要较真,它两的区别在于——异常通常是CPU被动接受,中断可以是其它设备主动发起。
中断(异常)名称 | 优先级 |
---|---|
复位异常(Reset) | 1 (最高优先) |
数据中止异常 | 2 |
快速中断异常(FIQ) | 3 |
外部中断异常(IRQ) | 4 |
预取异常 | 5 |
软中断异常(SWI) | 6 |
未定义指令异常 | 7 |
二、ARM体系的CPU工作模式
ARM体系下,CPU有7种工作模式:
- 用户模式(USR):CPU在正常的程序执行状态。
- 快速中断模式(FIQ):用于高速数据传输、通道处理。
- 中断模式(IRQ):通用的中断处理。
- 管理模式(SVC):也叫特权模式,操作系统使用的一种保护模式。
- 数据访问中止模式(ABT):数据或指令预取终止时,进入该模式。
- 系统模式(SYS):运行具有特权的操作系统任务。
- 未定义指令指令中止模式(UND):用于支持硬件协处理器的仿真。
可以看出,以上7种模式,和上述的7种中断类型有一定联系。
发生各类中断时,CPU自动进入对应的模式。
程序运行时,大都属于“用户模式”,其它6种模式也叫特权模式,为的是处理中断,保护被访问的系统资源。
在ARM状态下,每种工作模式都有16个通用寄存器和1个程序状态寄存器(Current Program Status Register)。 CPSR的具体含义可查手册。
ARM体系中,通常的中断执行步骤
- 保护现场。保存当前程序的状态到SPSR寄存器,保存当前的PC值到R14,可以理解为按下电视暂停键。
- 模式切换。根据中断类型,进入IRQ模式或者FIQ模式。可以理解为选择跑着去卫生间还是走着去。
- 多个中断请求处理。即同时产生多个中断时,识别优先级和中断标志位,判断应先处理哪个中断。
- 获取中断服务子程序地址。PC指针跳转到“中断向量表”保存的IRQ或FIQ中断向量地址处,即中断服务子程序的地址入口,可以理解为大脑获取卫生间的地址。
- 中断返回,恢复现场。当完成中断事件后,将SPSR寄存器中保存的程序状态恢复到CPSR寄存器中,R14保存的PC值恢复到PC中,继续先前执行的程序,可以理解为回来按下电视播放键继续看。
中断向量
中断向量就是中断源的识别标志,用来存放相应中断服务程序的入口地址(首地址),
中断向量表
ARM地址空间预先设置了一种表格结构,当中断发生时,查询这个表格就能获取该种中断的地址入口,而这个表格就叫“中断向量表”。
向量表开始于存储器映射的低地址0x00000000,个别处理器起始于高地址。
异常类型 | CPU模式 | 功能 | 低地址 |
---|---|---|---|
复位异常(Reset) | 特权模式 | 快速中断请求处理 | 0x0000000 |
未定义指令异常 | 未指定指令中止模式 | 外部中断请求处理 | 0x0000004 |
软中断异常(SWI) | 特权模式 | 操作系统的高级处理 | 0x0000008 |
预取指令异常 | 数据访问中止模式 | 操作系统的高级处理 | 0x000000C |
数据异常 | 数据访问中止模式 | 存储器保护 | 0x0000010 |
外部中断 | 外部中断请求模式 | 存储器保护 | 0x0000018 |
快速中断 | 快速中断请求模式 | 软件模拟硬件协处理器 | 0x000001C |
ARM体系的7种中断,详述
ARM体系,有7种不同的中断类型,而不同的中断源对应不同的中断地址入口,当中断发生时,CPU 将1个特定的存储器地址放入PC中,实现跳转。
1 复位异常
当CPU接收到复位引脚信号,即系统上电或系统复位时,系统产生复位异常中断。
此时,程序跳转到处理复位异常的中断服务程序,通常包含一些与系统初始化相关的操作:
- 设置异常中断向量表
- 初始化堆栈
- 初始化存储系统、关键I/O设备等
- 使能中断
- 切换CPU至适当的工作模式
- 初始化C语言变量,跳转到接下来的应用程序中
2 未定义指令异常
当ARM处理器执行任一外部<协处理器>的指令时,必须等待该协处理器应答后,才能真正地执行该指令,这一点类似于TCP协议中的“握手”。
但是如果协处理器没有应答,就会产生未定义指令异常。
如果尝试执行未定义指令,也会产生未定义指令异常,处理器会被切换到未定义指令中止模式。
3 SWI软中断异常
使用软中断指令,处理器会切换到管理模式,执行特定的管理(操作系统)函数。
4 预取指令中止异常
当指令预取访问存储器失败时,存储器想ARM处理器发出中止信号,该预取指令会被标记无效,但这时还不会产生异常,只有当ARM处理要执行标记过无效的指令时,才会产生异常。这里可以理解为,当发生2次预取指令失败时,就会产生异常。
当发生预取指令中止异常时,程序应返回到引发异常的指令处,重新读取并执行该指令,而不是返回到该指令的下一条指令处。
5 数据访问中止异常
如果数据访问指令的目标地址不存在,或者该地址不允许访问时,由存储器发出数据中止信号,产生数据访问中止异常。
6 外部中断请求异常
通过CPU的IRQ输入引脚,由外部产生IRQ异常,系统中的各种外设通常用这种中断方法请求服务。
7 快速中断请求异常
通过CPU的FIQ输入引脚,由外部产生FQI异常。
FIQ向量位于向量表末尾,这样可以省去一条跳转指令,能够提高响应速度。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通