【发布时间】:2021-05-27 15:01:18
【问题描述】:
当从内核(RING0)跳转到进程(RING1)时,无论我等待多久,时钟中断都不会发生。
但是在内核的中间,我使用sti 和hlt 来测试时钟中断然后它确实发生了。 我想知道时钟中断在进程中间从不工作的原因。
提前致谢。
这是我的流程代码。
#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