【发布时间】: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