MINIX 防止中断重入的代码有问题,还是我错了?

tanqing900920 2011-12-28 07:32:34
本人在学习MINIX,在做中断的时候,遇到一个百思不得其解的地方,minix 的代码
!*===========================================================================*
!* save *
!*===========================================================================*
! Save for protected mode.
! This is much simpler than for 8086 mode, because the stack already points
! into the process table, or has already been switched to the kernel stack.

.align 16
save:
cld ! set direction flag to a known value
pushad ! save "general" registers
o16 push ds ! save ds
o16 push es ! save es
o16 push fs ! save fs
o16 push gs ! save gs
mov dx, ss ! ss is kernel data segment
mov ds, dx ! load rest of kernel segments
mov es, dx ! kernel does not use fs, gs
mov eax, esp ! prepare to return
incb (_k_reenter) ! from -1 if not reentering
jnz set_restart1 ! stack is already kernel stack
mov esp, k_stktop
push _restart ! build return address for int handler
xor ebp, ebp ! for stacktrace
jmp RETADR-P_STACKBASE(eax)

.align 4
set_restart1:
push restart1
jmp RETADR-P_STACKBASE(eax)

;==============================我是分割线 ==================================;

;上面是保存CONTEXT的代码

;==============================我是分割线 ==================================;


! Note this is a macro, it looks like a subroutine.
#define hwint_master(irq) \
call save /* save interrupted process state */;\
inb INT_CTLMASK ;\
orb al, [1<<irq] ;\
outb INT_CTLMASK /* disable the irq */;\
movb al, ENABLE ;\
outb INT_CTL /* reenable master 8259 */;\
sti /* enable interrupts */;\
push irq /* irq */;\
call (_irq_table + 4*irq) /* eax = (*irq_table[irq])(irq) */;\
pop ecx ;\
cli /* disable interrupts */;\
test eax, eax /* need to reenable irq? */;\
jz 0f ;\
inb INT_CTLMASK ;\
andb al, ~[1<<irq] ;\
outb INT_CTLMASK /* enable the irq */;\
0: ret /* restart (another) process */

;==============================我又是分割线 ==================================;

;上面是8259A主片的宏
;==============================还是我 ==================================;

?????????????????????????

>>本人有一点很不明白百思不得其解,为什么只设置了一个(_k_reenter),来防止中断重入,试想一下,要是我先是键盘中断产生了,键盘程序没处理完,这时候时钟中断发生,因为键盘中断没处理完,那么(_k_reenter) 没有 减1,时钟这时候CMP (_k_reenter),0是不成立的,时钟ISR不能执行,这真的是滑天下之大稽了,难道他写的时候没发现这个有问题吗?还是我脑子进水了?
...全文
63 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧