0

我正在研究MIT 的 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));

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

4

1 回答 1

1

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

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

于 2015-12-05T21:48:40.253 回答