IA32IDT和linux中断处理程序



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

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

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

很抱歉犯了任何错误,我对这些东西都是新手,只是在努力学习。

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

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

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

当中断处理程序启动时,CPU会确定权限级别是否会发生更改(基于之前使用的权限级别和几乎总是为零的目标权限级别),并在必要时自动切换权限级别。这就是导致切换到CPL=0的原因注意:如果需要更改权限级别,CPU还会切换堆栈并在新堆栈上保存"return SS:ESP"

最新更新