Linux异常处理
总结Linux中的异常
概述
在Linux中,异常主要被包含为:
类别 | 原因 | 异步/同步 | 返回行为 |
---|---|---|---|
中断 | 来自I/O设备的信号 | 异步 | 总是返回到下一条指令 |
陷阱 | 故意的异常 | 同步 | 总是返回到下一条指令 |
故障 | 潜在的可恢复的错误 | 同步 | 可能会返回到下一条指令 |
终止 | 错误指令 | 同步 | 报错 |
需要注意的是,在有些资料(Intel手册)中会区分异步中断和同步异常。
所以还会有另外一种分类方式
- 异常:这个异常就包含了上面的同步异常
- 中断:就是上面分类的中断,异步中断
中断
中断是由硬件产生的,而不是由于某条指令产生的。在这个角度上说中断是异步的,处理中断的程序称之为中断处理程序。
中断的产生过程
执行完当前指令后,处理器发现某一个引脚的电平发生变化。然后通过一个可编程中断控制器(PIC)来进行控制,PIC连接着中断请求线(IRQ Interrupt ReQuest线)。
PIC通过监视IRQ线来掌握是否有中断的产生。由于计算机的发展,现在的计算机都不止一个cpu。相应的,PIC也升级为APIC(高级可编程中断控制器)。
这是使用APIC的情况。
陷阱
陷阱是故意的异常,通常使用于系统调用、程序调试等地方。
中断描述符表(IDT)
这个表的地址存储在中断描述符表寄存器(idtr)中,这个表一共包含了三种数据结构,这三种数据结构分别称之为:
- 任务门
- 中断门
- 陷阱门
这三种门分别用于处理对应的任务。
IDT的初始化
当计算机运行在实模式下时,IDT必须被初始化并由BIOS使用。但是一旦Linux接管后,这个IDT就会被Linux移动到ARM的某个区域中,并且进行第二次初始化。
Linux异常处理
https://ysc2.github.io/ysc2.github.io/2023/12/18/Linux异常处理/