本文转载自微信公众号「虚机」,作者cloud3 。转载本文请联系虚机公众号。
中断系统是现代PC的基础架构之一。中断处理在操作系统也具有举足轻重的作用 。
中断处理,伴随着软硬件的协同,伴随着外设与CPU的传递,伴随着内核栈和用户栈的切换,下面我们就看一下中断短暂而充实的一生。
以上是从设备触发到中断处理函数处理完毕的整个流程,为了看到中断处理的全貌,我们隐藏了一些实现细节,具体的细节以后再单独描述。
下面对每个调节进行简单的描述。
从设备到APIC
外部中断的发起者是设备,设备通过电平触发IRQ信号线产生一个中断。
检测到中断信号后,IOAPIC使用写内存的方式把中断信息发送到系统总线上。
LAPIC接收到中断信息后把中断能否发送给CPU处理。
CPU内部
CPU感知到中断线后,从LAPIC上接收中断号。
切换到内核栈。保存当前进程栈,例如在X86上会保存SS, ESP, EFLAGS, CS, EIP以及错误码。
然后通过IDTR寄存器和中断号找到中断服务程序的入口。
中断处理程序
一般把中断处理分为两个半部:中断处理程序是上半部(top half)和下半部(bottom half)。
上半部立会即执行,只做有严格时限的工作,例如对接收的中断进行应答或复位硬件,这些工作都是在所有中断被禁止的情况下完成的。
能够被允许稍后完成的工作会推迟到下半部(bottom half)去做。
从中断处理返回到CPU
恢复之前保存的flag和寄存器状态,恢复之前运行的进程。
再到中断处理程序
运行中断处理程序的下半部,把中断任务执行完成。
上面为了看到中断处理的全貌,我们隐藏了一些实现细节,具体的细节后面会在单独描述。