gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:35:56 25 4
gpt4 key购买 nike

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

最佳答案

在某些情况下不需要中断,因此它们被禁用。
例子很多,但我可以想出这些:

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

    @MichaelPetch 在对这个答案的评论中谈到了一些关于 8088 处理器(第一个 x86 处理器 8086 的“弱兄弟”)的专业知识,描述了这些“某些场合”的异常(exception):

    That is true about interrupts being turned off until the end of the next instruction (after moving a value into SS ), but there were 8088 processors with a bug where the interrupts weren't properly turned off after a SS change. Those of us (the dinosaurs) will often put CLI/STI around the SS:SP update just in case (Chances of running an 8088 system with such a bug is likely near zero). From a historical perspective, this PC mag article may shed some light on this ancient issue.



    (添加了代码格式化程序。)
  • 缺少 IDT/IVT。 当保护模式 IDT 被初始化或 16 位实模式 IVT 被修改(或清零或其他)时,中断将跳转到某个没有指令所在的内存位置。

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

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

    关于assembly - 为什么我们需要在系统启动或系统初始化时禁用所有中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34947408/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com