在系统初始化或启动代码级别禁用所有中断需要什么。如果我不禁用中断会发生什么?
答案 0 :(得分:6)
在某些情况下,中断是不受欢迎的,因此它们被禁用 这些例子很多,但我可以想出这些:
修改 ss:(e)sp
。如果触发了中断,flags
寄存器将被压入堆栈。无效的堆栈值会将该副本移动到某个随机位置。改变ss:(e)sp
不是原子的,至少在x86上,因为它包含多个指令,所以中断可以在两者之间触发。
但是,如果正确编写代码,则可以在不禁用中断的情况下实现相同的原子性,因为它们是automatically disabled on certain occasions。
关于中断被关闭直到结束时才是这样 下一条指令(将值移入
SS
后),但有8088 处理器有一个错误,中断没有被正确关闭SS
更改后。我们这些人(恐龙)经常会CLI
/STI
围绕SS:SP
更新以防万一(运行8088的机会 有这样一个bug的系统可能接近于零)。来自历史 透视,这PC mag article可能会对这个古老的人有所了解 问题。
(已添加代码格式化程序。)
通常,您可以说以某种非原子方式修改IDT / IVT的操作需要禁用中断。
顺便说一句:我自己已经编写了几个引导加载程序,并且通常会在引导加载程序的整个运行时中禁用中断。在保护模式下,我最终重新启用它们。 Linux 4.2同样处理它。如果您有兴趣,请阅读其源代码(/arch/x86/boot/
)或来自Minix的内容!