操作系统闲谈08——系统调用、中断、异常
一、系统调用
IDT - GDT - 系统调用表
- 找到对应系统调用号
- 将系统调用号以及一些现场信息存入寄存器eax中(ebx、ecx、edx存放其他信息),然后触发软中断(x86中,0x80为中断号)进入内核
- 在IDT表(中断描述符表)里根据中断向量号找到对应中断处理函数的入口地址
- 所有的系统调用号维护了一个系统调用表,需要在系统调用表中查找系统调用号是否存在,如果存在,进入内核对应的函数实现
- 最后恢复现场,恢复用户在进入内核前被保留到堆栈中的寄存器的值,从eax中获得系统调用的返回值
二、中断
中断处理之中断上下文、中断上下部和共享中断
01 中断上文、中断下文
如上图描述了linux内核中断的处理机制。
在中断执行时间尽可能短和中断处理大量工作中找到一个平衡点,linux将中断处理函数分为上部(top half)和下部(botoom half)。
上部完成尽可能少的紧急的中断,往往只是简单的寄存器读写操作并触发中断,将需要中断处理的程序放到下部的队列中,等待中断处理。
这样一来工作的中心就处于下部,下部来完成中断的绝大多数任务。下部中断处理程序可以被新的中断打断,上部中断不可被中断。
一句话总结是“上部中断触发,下部中断处理”。