【问题标题】:Masking interrupts when going back to kernel mode返回内核模式时屏蔽中断
【发布时间】:2016-03-10 13:47:41
【问题描述】:

我正在研究MIT's JOS(6.828 操作系统类的实验室)。

在这个简单的操作系统中,中断在内核模式下被禁用(cli 是内核运行的第一条指令)。一旦我们通过相应地设置 eflags 寄存器启动用户进程,中断就会重新启用,并且在返回内核模式时应该以某种方式再次被屏蔽。

我的问题是,在发生陷阱并且我回到内核模式之后,IF 仍然设置在 eflags 中。我很想使用cli 作为我的陷阱处理程序的第一条指令来清除它,但以下注释 (trap.c) 明确表示不要这样做:

// Check that interrupts are disabled.  If this assertion
// fails, DO NOT be tempted to fix it by inserting a "cli" in
// the interrupt path.
assert(!(read_eflags() & FL_IF));

我很困惑...还有其他方法吗?

【问题讨论】:

    标签: x86 operating-system kernel interrupt assembly-trap


    【解决方案1】:

    是的,您可以更改 IDT 中的相关条目,使其成为中断门,而不是现在的陷阱门。然后,每当触发中断时,CPU会在跳转到处理程序时自动清除EFLAGS.IF,并在使用IRETD从处理程序返回时恢复标志。

    我的猜测是 CLI 不会有太大帮助,因为虽然它禁用了中断,但它仍然允许嵌套中断,并可能导致堆栈溢出。仍然启用中断的一条指令 (CLI) 的这个小窗口足以让更高优先级的中断进行干预,据我了解,这在系统的当前实现或给您的任务中是不可取的。

    【讨论】:

    • “嵌套中断”是什么意思?
    猜你喜欢
    • 2011-08-19
    • 2012-04-15
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多