【问题标题】:Why the clock interrupt never works in the middle of process?为什么时钟中断永远不会在进程中间起作用?
【发布时间】:2021-05-27 15:01:18
【问题描述】:

当从内核(RING0)跳转到进程(RING1)时,无论我等待多久,时钟中断都不会发生。 但是在内核的中间,我使用stihlt 来测试时钟中断然后它确实发生了。 我想知道时钟中断在进程中间从不工作的原因。 提前致谢。

这是我的流程代码。

#include "type.h"
#include "const.h"
#include "intVector.h"
#include "important.h"
#include "process.h"
#include "prototype.h"
#include "task.h"
#include "global.h"

void delay(){
    for (int i = 0; i < 1; i++) {
        for (int j = 0; j < 10; j++) {
            for (int k = 0; k < 1000; k++) {}
        }
    }
}

PUBLIC void TestA() { //0x05:0x30d01
    int i = 0;
    while (1) {
        dispPos = 0;
        dispStr("A");
        dispInt(i++);
        dispStr(".");
        delay();
    }
}

【问题讨论】:

  • 进程运行时是否启用中断?
  • GHz CPU 上的 10000 次循环大约需要 0.00001 秒。也许使用while(true)
  • 所以换句话说,我的猜测是中断正在发生,但 bochs 根本没有向您显示。或者,bochs 在单步执行时暂停中断。
  • 0x1202 在 eflags 中禁用中断对吗?在通过将 IMR OCW 发送到 8259 PIC 来取消屏蔽时钟之前,在中断处理结束时似乎有一个虚假的 cli 我认为 ret 应该是 iret
  • 嗯,这就是我犯的错误,我想到的是第 9 位而不是第 9 位,所以是的,你是对的。而且,我现在明白了,您将 cont 推入堆栈。我只是瞥了一眼,看到你的 IRQhandler 被设置在 IDT 中,并认为这是最后一个级别,这会很奇怪,因为你不会恢复 eflags 或陷阱帧。这个问题比我想象的更微妙

标签: c assembly x86 interrupt osdev


【解决方案1】:

我不知道您是如何得出在用户模式下运行进程时不会发生时钟中断的结论,但事实并非如此。如果在这种情况下,在没有硬件计时器来允许它们tickless的系统上,应该没有办法重新获得对内核的控制,以防进程不让步cpu本身。真实的是,它对用户透明地发生,并且可以在上下文切换中结束,如果有一个更优先的过程并且是时候重新计算优先级了。

当然你不能在用户模式下禁止中断,所以在我看来,唯一让你知道中断发生的方法需要为时钟中断安装某种用户模式可访问计数器,并检查它定期,或使用数字信号分析仪检查总线中的硬件中断确认。

时钟中断通常是执行时间最短且优先级最高的中断,因此认为有什么东西阻碍了它实际上是非常奇怪的(通常,这意味着只有 nmi 会中断时钟滴答,但这通常意味着一些严重的硬件故障 ---nmi 历来与核心内存中的奇偶校验故障或即将断电有关)

【讨论】:

  • 我认为他希望看到“INT 0x20 发生!”在进程打印到屏幕的那些整数中间
  • 好吧,他可以使用内核调试器并在中断处理程序中放置断点....堆栈跟踪将带他解决问题....但我认为他不会能做这样的事。
  • 正如你所说,他试图在代码中识别中断被触发的位置和时间,恕我直言,他不知道硬件中断是什么。
  • mov edi,[dispPos]dispStr 中,但dispPos 似乎只设置为0,这不好。我期待看到一个VGA地址。至少@dispStr 有一个int 0x10
  • 肯定发生过,不是吗,您的系统时钟会变慢,而您的时间是正确的,对吗?在 linux 中,您可以cat /proc/interrupts,并且那里有计数器,用于记录系统已处理的所有中断。看看那里,看看时钟设备对应的中断是如何定期递增的。
猜你喜欢
  • 2021-02-14
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多