学习编程以来,离不开中断机制,那硬件中断和软件中断的区别是什么?他们的工作原理和流程又是怎样的?这里简单梳理一下~~~
1. 硬件中断
定义
硬件中断是由外部设备或硬件事件触发的异步信号,用于通知CPU需要处理某个事件。例如:
-
键盘按下按键。
-
网络数据包到达网卡。
-
定时器超时。
特点
-
异步性:硬件中断的发生时间不可预测,随时可能发生。
-
外部触发:由硬件设备触发,而不是由程序主动发起。
-
优先级:硬件中断通常有优先级,高优先级中断可以打断低优先级中断。
硬件中断的流程
-
中断触发:
-
外部设备(如键盘、定时器、网卡等)发生事件,向CPU发送中断请求信号。
-
中断请求信号被发送到中断控制器(如NVIC、APIC)。
-
-
中断控制器处理:
-
中断控制器根据中断的优先级决定是否响应当前中断。
-
如果当前中断优先级高于正在处理的中断,中断控制器会挂起当前中断,转去处理新的中断。
-
-
保存上下文:
-
CPU自动保存当前任务的上下文(如程序计数器PC、状态寄存器PSR等)到栈中。
-
-
跳转到中断服务程序(ISR):
-
CPU根据中断向量表找到对应的中断服务程序(ISR)地址,并跳转到该地址执行。
-
-
中断服务程序执行:
-
ISR是用户编写的函数,用于处理具体的中断事件。
-
ISR通常会读取相关寄存器以确认中断来源,并执行相应的处理逻辑。
-
-
清除中断标志:
-
在ISR中,需要清除触发中断的标志位,以防止重复触发中断。
-
-
恢复上下文:
-
ISR执行完毕后,CPU自动恢复之前保存的上下文。
-
-
返回到主程序:
-
CPU从栈中恢复程序计数器(PC),继续执行被中断的主程序。
-
硬件中断的示例
以STM32微控制器的GPIO中断为例:
-
当GPIO引脚的电平发生变化时,触发硬件中断。
-
CPU跳转到GPIO中断服务程序(ISR)执行。
-
在ISR中,读取GPIO状态并处理事件。
-
清除中断标志,返回到主程序。
2. 软件中断
定义
软件中断是由程序主动触发的同步事件,通常用于实现系统调用、异常处理或任务切换。例如:
-
在Linux中,用户程序通过软件中断(如
int 0x80
或syscall
指令)请求内核服务。 -
在嵌入式系统中,软件中断可以用于任务调度。
特点
-
同步性:软件中断的发生时间由程序控制,是主动触发的。
-
内部触发:由程序指令触发,而不是由外部硬件设备触发。
-
可控性:程序可以精确控制软件中断的触发时机和条件。
软件中断的流程
-
中断触发:
-
程序执行特定的指令(如
int 0x80
或syscall
)触发软件中断。
-
-
保存上下文:
-
CPU自动保存当前任务的上下文(如程序计数器PC、状态寄存器PSR等)到栈中。
-
-
跳转到中断处理程序:
-
CPU根据中断向量表找到对应的中断处理程序地址,并跳转到该地址执行。
-
-
中断处理程序执行:
-
中断处理程序是操作系统内核的一部分,用于处理软件中断请求。
-
例如,在Linux中,软件中断处理程序会根据系统调用号执行相应的内核函数。
-
-
恢复上下文:
-
中断处理程序执行完毕后,CPU自动恢复之前保存的上下文。
-
-
返回到用户程序:
-
CPU从栈中恢复程序计数器(PC),继续执行用户程序。
-
软件中断的示例
以Linux系统调用为例:
-
用户程序调用
write()
函数向屏幕输出数据。 -
write()
函数内部通过syscall
指令触发软件中断。 -
CPU跳转到内核的系统调用处理程序执行。
-
内核处理程序根据系统调用号执行
write()
的逻辑。 -
处理完成后,返回到用户程序继续执行。
3. 硬件中断 vs 软件中断
特性 | 硬件中断 | 软件中断 |
---|---|---|
触发方式 | 外部设备或硬件事件触发 | 程序指令触发(如int 0x80 ) |
异步性 | 异步,随时可能发生 | 同步,由程序控制 |
优先级 | 有优先级,高优先级可打断低优先级 | 通常无优先级 |
典型应用 | 处理外部设备事件(如键盘、定时器) | 系统调用、任务调度 |
上下文保存 | 硬件自动保存 | 硬件自动保存 |
处理程序 | 中断服务程序(ISR) | 中断处理程序(如系统调用处理程序) |
清除中断标志 | 需要手动清除 | 无需清除 |
4. 总结
-
硬件中断 是由外部设备触发的异步事件,用于处理实时性要求高的任务(如键盘输入、定时器超时等)。
-
软件中断 是由程序主动触发的同步事件,通常用于实现系统调用或任务调度。
无论是硬件中断还是软件中断,它们的核心目标都是让CPU能够及时响应事件,并确保系统的稳定性和实时性。