gpt4 book ai didi

C 内核 - while 循环期间中断不工作

转载 作者:行者123 更新时间:2023-11-30 19:42:37 30 4
gpt4 key购买 nike

我正在用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

最佳答案

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

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

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

关于C 内核 - while 循环期间中断不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31306982/

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