时钟中断的重入问题
hwint00: ; 时钟中断处理程序
sub esp, 4
pushad ; ┓
push ds ; ┃
push es ; ┣ 保存原寄存器值
push fs ; ┃
push gs ; ┛
mov dx, ss
mov ds, dx
mov es, dx
mov esp, StackTop ; 切到内核栈
;sti ;置位中断标志位,使cpu可以响应新的中断
push clock_int_msg1 ;这里打印字符 ^
call disp_str
add esp, 4
push 10 ;设置延迟,以便让中断重入
call delay
add esp, 4
push clock_int_msg2 ;这里打印字符 ~
call disp_str
add esp, 4
;cli ;清除中断标志位
mov al, EOI ; ┓发送EOI
out INT_M_CTL, al ; ┛
mov esp, [p_proc_ready] ; 离开内核栈;
lea eax, [esp + P_STACKTOP]
mov dword [tss + TSS3_S_SP0], eax
pop gs ; ┓
pop fs ; ┃
pop es ; ┣ 恢复原寄存器值
pop ds ; ┃
popad ; ┛
add esp, 4
iretd
内核运行后打印
B0x0^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~
现在在内核中只实现了一个进程,那个B0x0就是那个进程产生的,那进程如下
void Test()
{
int i=0;
while (1)
{
disp_str("B");
disp_int(i++);
}
}
由于产生中断时会把中断标志位IF清0,所以我觉得如果把sti和cli注释掉后中断就不会再发生,因些不可能会出现中断重入的情况,但在调试时却出现了,真不知是哪个地方出现了问题。。。
[解决办法]
哥们,你那函数中disp_str和disp_int如何实现的?可能用到了软中断吧?那不几产生了中断嵌套的问题?一般中断中打印都要特别处理的,不会调用系统的例程,而是直接操作底层硬件。不知道你的打印怎么实现的。
[解决办法]