【问题标题】: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)
我想知道的是
为什么在开始例程之前需要cli。
在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 函数可让您更改显示模式并在屏幕上写入文本。