【问题标题】:IA32 IDT and linux interrupt handlerIA32 IDT 和 linux 中断处理程序
【发布时间】:2015-06-28 11:08:58
【问题描述】:

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

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

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

抱歉有任何错误,我对所有这些东西都是新手,只是想学习。

【问题讨论】:

    标签: linux linux-kernel x86 interrupt


    【解决方案1】:

    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”。

    【讨论】:

    • 但是系统调用有DPL=3,所以cpu不需要改CPL,为什么要改呢?
    • 因为系统调用的目的之一是改变CPL。
    • @Josh:DPL 是您使用它所需的权限级别。例如。如果中断设置为“DPL=1”,则以 CPL=3 或 CPL=2 运行的代码无法使用它(将获得一般保护错误),而以 CPL=1 或 CPL=0 运行的代码可以使用它。无论谁使用它,新的特权级别都是相同的。请注意,“使用中断”意味着使用软件中断(如int 0x80)——对于 IRQ 和异常,CPU 知道硬件正在使用它而不是当前软件,因此不检查 CPL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    相关资源
    最近更新 更多