回到内核模式时屏蔽中断

时间:2015-12-05 17:23:16

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

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

在这个简单的操作系统中,在内核模式下禁用中断(L = zeros(N,I); for i = 1:I-1 L(:,(i + 1) * tau ) = L(:,i*tau) + normrnd(mu, sigma,N,1); end X = L; 是内核运行的第一条指令)。一旦我们通过相应地设置eflags寄存器来启动用户进程,就会重新启用中断,并且在返回内核模式时应该以某种方式再次屏蔽。

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

cli

我很困惑......还有另外一种方法吗?

1 个答案:

答案 0 :(得分:1)

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

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