gpt4 book ai didi

c - x86 中断处理程序在使用无限循环时被阻塞

转载 作者:太空宇宙 更新时间:2023-11-04 06:53:34 27 4
gpt4 key购买 nike

我正在尝试学习 x86 汇编和 C 语言。现在我已经完成了一个简单的定时器和键盘中断。第一个可以每隔几个刻度打印一行,第二个可以打印你在键盘上按下的内容。代码就像:

Timer.c:

print();
return;

keyboard.c:

print();
return;

ma​​in.c:

while(1);

这两个处理程序在 IDT 中。所以当中断发生时,IF标志被清除。 CPU 将忽略其他中断。在我的主函数中初始化所有配置后,我用一个无限循环完成它,就像:while(1)。好的,这很好,我可以在屏幕上看到这两个处理程序在工作。
但是,当我想让它成为嵌套中断时,我做了以下事情:

Timer.c:

sti();      //set IF to 1 to enable interrupt 
print();
while(1); // wait here to test if the keyboard interrupt can occur
return;

keyboard.c:

print();
return;

ma​​in.c:

while(1);

接下来发生的事情真的让我感到困惑:使用 Bochs,我可以看到我的程序只是在 timer.c 中执行 while 循环。这时,我检查了标志,它显示 IF 标志已经设置,但是当我试图输入一些东西来测试另一个中断时,它失败了。似乎所有的中断都被阻止或忽略了。

问题是,这两个循环有什么区别,一个只是在中断处理程序中,另外,我不知道如何解决这个问题。我在我的 vmware 和 virtualbox 中仔细检查了我的代码,但结果是一样的。

我知道这个问题一定是在我遇到它之前发生的,但是,我找不到与这个问题相关的任何内容。

最佳答案

定时器中断 (IRQ0) 优先于键盘中断 (IRQ1)。

因此,即使您通常在定时器中断处理程序中启用中断(使用 sti 指令),主中断 Controller (PIC) 也只会启用更高优先级的中断,直到您的定时器/IRQ0 服务例程完成。

有关一些其他说明,请参阅:https://groups.google.com/forum/#!topic/comp.lang.asm.x86/7coo0px-BU4

Right, that is what happens. The interrupt controller (the primary one, in this case) which signalled the timer interrupt to the CPU will not allow any equal or lower priority interrupts through until the CPU has told it that the timer interrupt has finished, through the EOI instruction (outportb(0x20, 0x20) for the primary interrupt controller).

可以在技术上向 PIC 发出 EOI 指令,告诉它 IRQ0 的处理已完成,但您可能会为一些非常困惑的场景和竞争条件做好准备。

让中断处理程序只处理它们的特定中断并保存相关状态会更清晰。然后,让您的主程序观察您需要的顺序(例如计时器,然后是键盘)

关于c - x86 中断处理程序在使用无限循环时被阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47910824/

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