关于异常的部分笔记

定义:

        在cpu执行程序(指令),有可能会出现意外情况,需要去解决对应的意外情况,就叫做异常 。

1、异常源

        在ARM体系结构中设计了7种异常源,ARM架构就需要对这些异常源进行处理,只要执行程序指令时产生对应的异常就会执行对应的异常处理。

         只要发生对应的异常时,处理器就会把PC寄存器设置为特定的存储器地址。这个地址被放在称为向量表的范围内,向量表内就是一些跳转操作。即CPU设计了一个向量表来表示每一种异常的处理方式,只要产生异常,pc寄存器就会被设置为向量表中的对应异常的地址,执行异常向量表中的对应指令(跳转执行,执行对应的处理办法)

        异常源:

异常源的种类及什么时候执行
异常什么时候执行
Reset上电就执行
undef当流水线中某个非法指令被执行
(undefined) swi当程序执行软中断指令时执行
(supervisor svc) prefetch当指令从内存进行存取指令失败时执行
(abort) datadata 当指令从内存存取数据失败时执行
(abort) irqirq 一般中断 fiq 快速中断

2、异常产生时发生的硬件操作

步骤:

        1、保存执行状态 把cpsr寄存器的内容复制到对应产生异常的模式下的spsr;

        2、模式切换

        a、由硬件自动把cpsr中的模式[4:0]设置为与异常相对应的值 ;

        b、处理器设置为ARM状态,执行ARM指令 c、禁止中断,如进入FIQ模式自动把IRQ中断禁止。

        3、保存返回地址 把当前的下一条指令的地址(PC寄存器)保存到 lr_mode 寄存器(异常模式下);

        4、跳入异常向量表 强制设置pc寄存器为对应异常向量地址。

3、异常向量表 

        异常向量表是一段特定的内存空间,每一种ARM异常都在异常向量中设定出来,对应一个字长空间(4Byte-32bit),刚好就是一条ARM指令大小。当产生异常时,cpu会强制把pc的值设置为异常对应的固定内存地址。

        注: 当产生异常后硬件能够完成的操作就只是跳转到异常向量表(pc赋值为异常向量地址),剩下的异常处理都是程序员去完成,通常都是在异常向量中写一条跳转指令,表示产生异常应该怎么做,跳转到对应的地址(异常处理的地址)执行。

4、异常处理(自己实现)

步骤:

        1、保存执行现场(进入异常之前的寄存器的值) 把寄存器的值保存到对应异常模式下的栈(内存)(入栈),sp寄存器存栈地址;

        2、执行对应的异常操作;

        3、恢复之前现场 当异常处理完,要返回异常之前的状态,继续执行 a、恢复之前的寄存器数据(从sp对应的栈出栈存储到对应寄存器) b、恢复程序运行是的状态cpsr c、通过异常进入时保存的返回地址(lr寄存器),可以返回到被打断的程序继续执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值