IA32 IDT和linux中断处理程序

时间:2015-06-28 11:08:58

标签: linux linux-kernel x86 interrupt

在IDT中,每一行都有一些称为" DPL" - Descriptor Privileg Level,0表示内核,3表示普通用户(可能有更多级别)。我不明白两件事:

  1. 这是运行中断处理程序代码所需的级别吗?或触发导致它的事件?因为system_call的DPL = 3,所以在用户模式下我们可以做" int 0x80"。但是在linux中只有内核处理中断,所以我们可以触发事件但不处理它?即使我们有正确的CPL。

  2. 在linux中只有内核处理中断,但是当发生中断(或陷阱)时,是什么让我们进入内核模式?

  3. 对不起任何错误,我是所有这些新手,只是想学习。

1 个答案:

答案 0 :(得分:2)

IDT有3种类型的条目 - 陷阱门,中断门和任务门(没有人使用)。对于陷阱门和中断门;该条目主要描述了中断处理程序的目标CS和EIP。

IDT条目中的DPL字段确定使用门所需的权限级别(或者,切换到由门描述的目标CS和EIP)。软件只能使用gate via。软件中断(例如int 0x80)。

对于IRQ和例外,硬件使用门而不是软件。硬件没有权限级别,并且始终能够使用门(无论当前使用哪种权限级别的软件,无论门的DPL如何)。这意味着IRQ处理程序应该具有DPL = 0(以确保在CPL = 3下运行的软件不能通过软件中断使用它们。)

当启动中断处理程序时,CPU确定是否会进行权限级别更改(基于事先使用的权限级别以及几乎始终为零的目标权限级别)并自动切换权限级别必要。这是导致切换到CPL = 0的原因。 注意:如果需要更改权限级别,CPU也会切换堆栈并在新堆栈上保存“return SS:ESP”。