异常和中断

异常和中断是异常控制流产生的根本原因。
程序在执行指令过程中,CPU会遇到一些异常的、意外的情况(执行指令有一个正常的顺序,现在这个正常的顺序被意外的事件给打断了),使正在执行的程序被“中断”。
CPU中止原来正在执行的程序(用户态),转到处理异常或特殊事件的程序(内核态)去执行,结束后再返回到原被中止的程序“断点”处继续执行。当然,小问题包扎伤口可以继续向后执行,大问题进程没办法执行下去就会被杀死。“断点”即被中断的指令的地址,如果回来的话有可能从该条指令继续执行,比如进程缺页。我们在程序 debug 的时候,时常是安排好的“异常”,比如说打个断点,故意让CPU在内核空间转一圈再回到“断点”继续执行,那么这里的**“断点”应当是中断指令下一条指令的地址**。
程序执行被“中断”的事件(在硬件层面)有两类
1.内部“异常”:在CPU内部发生的意外事件或特殊事件,按发生原因分为硬故障中断程序性中断两类。
硬故障中断:如电源掉电、硬件线路故障等。
程序性中断:执行某条指令时发生的“例外 (Exception)”事件,如溢出、缺页、越界、越级、越权、非法指令、除数为0、堆/栈溢出、访问超时、断点设置、单步、系统调用等。
2.外部“中断”:在CPU外部发生的特殊事件,CPU有很多引脚,其中有一个引脚叫“中断请求线”。这些特殊事件通过“中断请求”信号向CPU请求处理。如实时钟、控制台、打印机缺纸、外设准备好、采样计时到、DMA传输结束等。

“陷阱(Trap)异常”
陷进也称自陷或陷入,执行陷阱指令(自陷指令)时,CPU调出特定程序进行相应处理,处理结束后返回到陷阱指令下一条指令执行。
在这里插入图片描述
陷阱的作用之一是在用户和内核之间提供一个像过程一样的接口,这个接口成为系统调用,用户程序利用这个接口可方便地使用操作系统内核提供的一些服务。操作系统给每个服务编号,称为系统调用号。例如,Linux 系统调用 fork、read 和 execve 的调用号分别是1、3和11。
IA-32处理器中的 int 指令和 sysenter 指令、MIPS处理器中的 syscall 指令等都属于陷阱指令(相当于“地雷”)。有条件“爆炸”

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值