我正在研究麻省理工学院的何塞 ( 6.828操作系统实验室)。
在这个简单的操作系统中,中断在内核模式下被禁用(cli是内核运行的第一条指令)。一旦启动了用户进程,就会重新启用中断,并相应地设置e标志注册,并且应该在返回内核模式时再次屏蔽中断。
我的问题是,在陷阱发生之后,我又回到了内核模式,如果仍然设置在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));我很困惑..。还有别的办法吗?
发布于 2015-12-05 21:48:40
是的,您可以更改IDT中的相关条目,使其成为中断门,而不是现在的陷阱门。然后,每当触发中断时,CPU将在跳转到处理程序时自动清除EFLAGS.IF,并在使用IRETD从处理程序返回时恢复标志。
我猜CLI不会有多大帮助,因为虽然它禁用中断,但仍然允许嵌套中断,并可能导致堆栈溢出。一个指令的这个小窗口(CLI)中仍然启用了中断,这足以使一个更高优先级的中断进行干预,据我所知,这在系统或任务的当前实现中是不可取的。
https://stackoverflow.com/questions/34108481
复制相似问题