操作系统闲谈08——系统调用、中断、异常

操作系统闲谈08——系统调用、中断、异常

一、系统调用

IDT - GDT - 系统调用表

  • 找到对应系统调用号
  • 将系统调用号以及一些现场信息存入寄存器eax中(ebx、ecx、edx存放其他信息),然后触发软中断(x86中,0x80为中断号)进入内核
  • 在IDT表(中断描述符表)里根据中断向量号找到对应中断处理函数的入口地址
  • 所有的系统调用号维护了一个系统调用表,需要在系统调用表中查找系统调用号是否存在,如果存在,进入内核对应的函数实现
  • 最后恢复现场,恢复用户在进入内核前被保留到堆栈中的寄存器的值,从eax中获得系统调用的返回值

二、中断

中断处理之中断上下文、中断上下部和共享中断

01 中断上文、中断下文

操作系统闲谈08——系统调用、中断、异常_第1张图片

如上图描述了linux内核中断的处理机制。

在中断执行时间尽可能短和中断处理大量工作中找到一个平衡点,linux将中断处理函数分为上部(top half)和下部(botoom half)。

上部完成尽可能少的紧急的中断,往往只是简单的寄存器读写操作并触发中断,将需要中断处理的程序放到下部的队列中,等待中断处理。

这样一来工作的中心就处于下部,下部来完成中断的绝大多数任务。下部中断处理程序可以被新的中断打断,上部中断不可被中断。

一句话总结是“上部中断触发,下部中断处理”。

02 中断上下文切换

操作系统闲谈08——系统调用、中断、异常_第2张图片

三、异常

操作系统闲谈08——系统调用、中断、异常_第3张图片

你可能感兴趣的:(操作系统,linux)