为什么我们需要在系统启动或系统初始化时禁用所有中断?

时间:2016-01-22 13:04:17

标签: assembly kernel startup interrupt

在系统初始化或启动代码级别禁用所有中断需要什么。如果我不禁用中断会发生什么?

1 个答案:

答案 0 :(得分:6)

在某些情况下,中断是不受欢迎的,因此它们被禁用 这些例子很多,但我可以想出这些:

  • 修改 ss:(e)sp 如果触发了中断,flags寄存器将被压入堆栈。无效的堆栈值会将该副本移动到某个随机位置。改变ss:(e)sp不是原子的,至少在x86上,因为它包含多个指令,所以中断可以在两者之间触发。
    但是,如果正确编写代码,则可以在不禁用中断的情况下实现相同的原子性,因为它们是automatically disabled on certain occasions

    @MichaelPetch发表了一些关于8088处理器(#80;较弱的兄弟" 8086,第一个x86处理器)的专业,描述了这些"某些场合的例外,"在对这个答案的评论中:

      

    关于中断被关闭直到结束时才是这样   下一条指令(将值移入SS后),但有8088   处理器有一个错误,中断没有被正确关闭   SS更改后。我们这些人(恐龙)经常会CLI / STI   围绕SS:SP更新以防万一(运行8088的机会   有这样一个bug的系统可能接近于零)。来自历史   透视,这PC mag article可能会对这个古老的人有所了解   问题。

    (已添加代码格式化程序。)

  • 缺少IDT / IVT。保护模式IDT初始化或16位实模式IVT被修改(或清零或其他)时,中断会跳转到某个内存位置没有说明。

通常,您可以说以某种非原子方式修改IDT / IVT的操作需要禁用中断。

顺便说一句:我自己已经编写了几个引导加载程序,并且通常会在引导加载程序的整个运行时中禁用中断。在保护模式下,我最终重新启用它们。 Linux 4.2同样处理它。如果您有兴趣,请阅读其源代码(/arch/x86/boot/)或来自Minix的内容!