我正在研究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
我很困惑......还有另外一种方法吗?
答案 0 :(得分:1)
是的,您可以更改IDT中的相关条目,使其成为中断门,而不是现在的陷阱门。然后,每当触发中断时,CPU会在跳转到处理程序时自动清除EFLAGS.IF,并且在使用IRETD从处理程序返回时将恢复该标志。
我的猜测是CLI不会有多大帮助,因为虽然它禁用了中断,但它仍然允许嵌套中断,并可能导致堆栈溢出。这个中断仍处于启用状态的一个指令(CLI)的小窗口足以让更高优先级的中断进行干预,据我所知,这在当前的系统实现或您给出的任务中是不可取的。