【问题标题】:How does the user to kernel mode switch occur before the Interrupt Gate descriptor is accessed?在访问中断门描述符之前,用户如何切换到内核模式?
【发布时间】:2016-10-05 08:39:34
【问题描述】:

我目前正在阅读“了解 Linux 内核”。我正在学习中断和异常一章。

我发现在设置 IDT 时,我们可以使用 Linux 术语中的五种门描述符

  1. 任务门(DPL:0)
  2. 中断门 (DPL: 0)
  3. 陷阱门 (DPL: 0)
  4. 系统中断门 (DPL: 3)
  5. 系统门(DPL:3)

现在我意识到可以从用户模式访问具有 DPL 3 的那些。 但是那些有 DPL 0 的呢?特别是中断门。

如果在用户模式下发生 I/O APIC 中断,它将无法访问中断门。

所以我的问题是,在访问中断门之前,用户模式内核模式切换是如何发生的?

【问题讨论】:

    标签: x86 interrupt cpu-architecture protected-mode


    【解决方案1】:

    发生硬件中断时,可以忽略当前执行代码的权限级别; CPU 可以简单地切换到中断的特权级别而不检查它。

    Intel 64 and IA-32 Architectures Software Developer’s Manual 第 3A 卷:系统编程指南,第 1 部分在第 6.12.1.1 节中说:

    异常和中断处理程序的保护

    异常和中断处理程序的特权级保护类似于普通的 通过调用门调用时的过程调用(请参阅第 5.8.4 节,“通过调用访问代码段 门”)。处理器不允许将执行转移到异常处理程序或中断处理程序 与 CPL 相比,特权级别较低的代码段(数值上更高的特权级别)。

    尝试违反此规则会导致一般保护异常 (#GP)。保护机制 异常处理程序和中断处理程序在以下方面有所不同:

    • 因为中断和异常向量没有 RPL,所以 RPL 不会在对异常的隐式调用和 中断处理程序。
    • 仅当异常或中断产生时,处理器才会检查中断或陷阱门的 DPL INT n、INT 3 或 INTO 指令。这里,CPL 必须小于或等于门的 DPL。这 限制阻止以特权级别 3 运行的应用程序或过程使用软件 中断以访问关键异常处理程序,例如页面错误处理程序,前提是这些处理程序是 放置在更多特权代码段(数值较低的特权级别)。对于硬件生成 中断和处理器检测到的异常,处理器会忽略中断和陷阱门的 DPL。

    由于异常和中断通常不会在可预测的时间发生,因此这些特权规则有效 对异常和中断处理过程可以运行的特权级别施加限制。任何一个 以下技术可用于避免特权级违规。

    • 可以将异常或中断处理程序放置在符合要求的代码段中。该技术可用于 只需要访问堆栈上可用数据的处理程序(例如,除错误异常)。如果 处理程序需要来自数据段的数据,该数据段需要可从特权级别 3 访问,这 会使其不受保护。
    • 处理程序可以放置在特权级别为 0 的不合格代码段中。此处理程序将始终 运行,无论被中断的程序或任务在哪个 CPL 上运行。

    【讨论】:

    • 感谢您的回答。我只想再确认一件事,即使 CPU 切换到新的特权级别,CPL 仍然保持不变。正确的 ? IE。 3个用户级别
    • 但如果是这种情况,那么正如中断和异常的硬件处理中的第 4 点所述,CPL 和 DPL 将已经相同。比较它们有什么意义?他们什么时候不相等??
    • 哦,我现在明白了,(我想)。这正是 CPU 切换到中断特权级别的地方。是这样吗?
    • 非常感谢您的参考和解答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2013-10-04
    • 2012-05-09
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多