在bootloader中启动前的cli

时间:2012-05-21 02:48:36

标签: assembly x86 bootloader

我在网上冲浪时发现了512字节的os竞赛。

一切都安装在bootsector中。

阅读其中一些源文件后,

我发现在启动例程之前总是有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之后使用中断会不正常呢?

2 个答案:

答案 0 :(得分:6)

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

2)软件中断(例如int 0x10)不是IRQ,并且未被cli禁用。在sti之后很快做cli以避免弄乱IRQ是正常的。当你试图以512字节的方式挤压某些东西时,做一些没有理智的程序员会考虑允许的愚蠢的事情是正常的(比如让中断禁用)只是为了挤压一个额外的代码字节。

答案 1 :(得分:4)

只有当我们不希望硬件中断服务时才需要

cli

在没有看到实际代码的情况下,很难说明为什么它会在你所指的代码中使用,但通常会有多种原因:

  • 以避免使用中断服务程序的竞争条件(访问共享可变数据时)
  • 以原子方式更改中断向量表(非常类似于上面的内容)
  • 以原子方式更改SS:SP(非常类似于上述内容)
  • 以避免在切换CPU模式时由ISR引起的异常(真实< - >保护)
  • 更精确地测量时间以避免ISR贡献

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

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