从IDT开始

在x86平台上,专门有一张表来保存中断和异常处理对应的函数。这张表就叫做IDT(Interrupt Descriptor Table)。

IDT的长相

先来看手册上的一张图,这张图是在SDM Volume 3中的Figure 2-1. IA-32 System-Level Registers and Data Structures。

IA-32 System-Level Registers and Data Structures

在这张图中, IDT位于最左边靠近下方的部分。和GDT/LDT类似,IDT的位置由IDTR寄存器保存。所以在代码中加载IDT的代码如下:

而其中struct desc_ptr的一个实现则长成这个样子:

嗯,这下算是把代码和手册在这个点上结合起来了。

IDT的基本工作过程

具体的过程是有点复杂的,那在这里对我而言只要知道一下这点暂时就足够用了。

CPU在执行下一条指令之前,将会检查此时是否有中断或者异常发生。如果有,则会判断中断或异常的vector number。在做完一系列检查、保护工作之后,会执行IDT中对应vector number的处理函数。

具体这个vector number是如何得到的,又做了哪些检查和保护,不在本次学习的重点中。关键是我们知道了硬件的IDT和软件代码之间的关系。

内核中IDT的布局

说的这么眼花缭乱,那我们来看看内核中IDT是个什么样子吧。这个呢就在内核代码arch/x86/include/asm/irq_vectors.h中了。

心中的疑惑

到这里,虽然已经对IDT有了大致的了解,但是我想你一定也和我一样还有很多疑惑。

  • 中断和异常有区别么?

  • 中断和异常里究竟有什么?

不着急,让我们一点点揭开这神秘的面纱。

Last updated

Was this helpful?