Oragner's 操作系统中时钟中断, 为了防止嵌入中断这里添加了 k__reenter 这个变量初始化为 -1,
- 在发生第一次中断时 inc [k_reenter] 将, k_reenter 变为0, 将进入输出 ^
- 进入 delay 中由于延时将再次导致中断,这时 k_reenter 变为1,退出中断处理 k_reenter 变为0
- 当再次进入中断时, 每次 k_reenter 都变为 1 了,按道理应该直接就退出中断处理了,但为什么还是会输出 ^ 呢???
-
我觉得应该把 dec [k_reenter] 改为 mov [k_reenter], -1 应该合理啊??
sub esp, 4 pushad push ds push es push fs push gs mov dx, ss mov ds, dx mov es, dx inc byte [gs:0] mov al, EOI out INT_M_CTL, al inc dword [k_reenter] cmp dword [k_reenter], 0 jne .re_enter mov esp, [kernel_top] sti push '^' call put_char add esp, 4 push 1 call delay add esp, 4 cli ; mov esp, [current] lea eax, [esp + P_STACKTOP] mov dword [tss + TSS3_S_SP0], eax
.re_enter: dec dword [k_reenter] pop gs pop fs pop es pop ds popad add esp, 4 iretd