【问题标题】:cli before start in bootloader在引导加载程序中启动之前的 cli
【发布时间】:2012-05-21 02:48:35
【问题描述】:

我在网上冲浪时发现了 512 字节操作系统竞赛。

所有东西都安装在引导扇区中。

在阅读了其中的一些源文件后,

我发现在开始例程之前总是有cli 指令。 (组装中)

use16
org 7c00h
jmp 0:start
start:
  cli
  do something here..(this section sometimes include int 10h)

我想知道的是

  1. 为什么在开始例程之前需要cli

  2. cli 之后,有时他们会使用中断!比如int 10h 不知道为什么他们在cli之后使用中断会正常吗?

【问题讨论】:

  • 你能告诉我们这个“在这里做点什么”吗?

标签: assembly x86 bootloader


【解决方案1】:

1) cli 在引导扇区初始化之前(或之内)必要的唯一情况是引导扇区可能在 8086 上运行。对于以后加载 ss 的 CPU 会导致中断被禁用(推迟)直到下一条指令之后,该指令足够长以加载 sp 并获得一个有效的 ss:sp 以供潜在的 IRQ 处理程序使用。

2) 软件中断(例如int 0x10)不是 IRQ,也不会被cli 禁用。在cli 之后立即执行sti 是正常的,以避免弄乱IRQ。当您尝试将某些内容压缩为 512 字节时,通常会做一些没有理智的程序员会考虑允许的愚蠢事情(例如禁用中断),只是为了压缩一个额外的代码字节。

【讨论】:

    【解决方案2】:

    cli 仅在我们现在不希望处理硬件中断时才需要。

    如果没有看到实际代码,很难说出为什么在您所指的代码中使用它,但通常可能有多种原因:

    • 避免中断服务例程的竞争条件(访问共享可变数据时)
    • 以原子方式更改中断向量表(与上述非常相似)
    • 以原子方式更改SS:SP(与上述非常相似)
    • 避免在切换 CPU 模式时由 ISR 引起的异常(真实受保护)
    • 更精确地测量时间,避免 ISR 贡献

    基本上,只要硬件 ISR 可能以某些不希望的方式干扰主代码,您就会禁用中断。

    哦,int 10h 与来自硬件的中断请求无关。只是一些 ISR 用于处理硬件中断(例如来自键盘或网络),而另一些则用作各种帮助程序或具有方便接口的系统调用(您不需要知道 ISR 的确切位置,向量数字(10h)就足够了)。 BIOS int 10h 函数可让您更改显示模式并在屏幕上写入文本。

    【讨论】:

      猜你喜欢
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 2020-05-31
      • 2014-10-03
      • 1970-01-01
      相关资源
      最近更新 更多