时钟中断的重入问题
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如何实现的?可能用到了软中断吧?那不几产生了中断嵌套的问题?一般中断中打印都要特别处理的,不会调用系统的例程,而是直接操作底层硬件。不知道你的打印怎么实现的。
------解决方案--------------------
------解决方案--------------------不经意之间翻出了这个帖子,哥们,问题还解决了。貌似大家没能提供有用的信息。
直接写显存是没有问题的
------解决方案--------------------不太明白你说的意思,这个显示结果跟重入有啥关系?当进入中断时会保存eflag,退出时会恢复eflag,你在中断程序里开关中断有啥用?只要进入中断前是开中断的,退出后中断又打开了。时钟中断程序就能不停运行。
------解决方案--------------------
是不是这样:
   push    10            ;设置延迟,以便让中断重入
   call    delay
   add        esp, 4  
你关掉中断后(注释掉了sti),delay的时候一直就是在中断处理函数里面(你的delay肯定是循环实现的吧),delay后直接运行了你的单独的进程,这时候下一个时钟中断就到了,也就是说你的进程实际上没有多少实际的执行时间
你是不是在写OS?并且还没有加入调度函数吧,呵呵
------解决方案--------------------
按你的程序里的进程的代码,进程里没加 delay,是不会打印出像你据说的效果的。而是在第一次中断之前,飞快的打印出几十个B0x0 B0x01 B0x02...直到~^~^~^~