-1

我在 c 中从头开始制作内核(不是 linux。完全从头开始),我遇到了一些问题。我有这个代码:

#include "timer.h"
int ms = 0;
void timer_handler(struct regs *r){
    ms++;
    println("I print every tick");
}
void sleep(int ticks){
    unsigned long eticks;

    eticks = ms + ticks;
    while(ms < eticks);
}

并且 timer_handler 连接到 IRQ0(PIT)并且工作得很好。说“我打印每个刻度”的 println 工作得很好,如果我在我的代码中打印 ms 变量,它会打印正确的数量。但是,如果我调用 sleep 函数,timer_handler 会停止触发并陷入无限循环。有什么办法可以让中断在while循环中触发?

其余代码:https ://github.com/Codepixl/CodeOS

4

2 回答 2

0

听起来您没有发送end of interrupt。您需要在中断处理程序中为 IRQ0执行一个outb(0x20,0x20)(端口和数据值相同,因此无论您如何定义)。outb如果您只收到一次中断,从您的问题中不清楚您是否收到任何中断,那么这很可能是您的问题。如果没有发布所有相关代码,例如您在哪里设置 IDT。

如果不是这种情况,您可以做的一件简单的调试事情是通过int相应 IDT 的指令引起软件中断。如果这有效,那么它与 PIC 或 PIT 相关,而不是您的 IDT 条目。

此外,正如其他人所提到的,您应该使用msvolatile 或使用屏障,以便编译器不会优化读取值。我不认为这是你的问题,因为如果发生定时器中断,你仍然会看到多个打印。

于 2015-07-09T13:14:33.643 回答
0

出于某种原因,它只是 virtualbox,它可以在我的实际 PC 上运行。

于 2015-07-09T15:35:29.723 回答