我正在研究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));
我很困惑......还有其他方法吗?