中断发生时寄存器的保存和恢复
http://blog.csdn.net/zhuichao001/article/details/5686058
进程在运行之前TSS.ESP0指向了当前进程表的 REGS 末尾
执行中断之前,CPU已经把ESP指向进程表的REGS末尾,并且保存了SS,ESP,CS ,IP ,IF寄存器 ,自动操作的 么?没看到人工代码
ALIGN 16
hwint00: ; Interrupt routine for irq 0 (the clock).
sub esp, 4
pushad ; ┓
push ds ; ┃
push es ; ┣ 保存原寄存器值
push fs ; ┃
push gs ; ┛
mov dx, ss
mov ds, dx
mov es, dx
mov esp, StackTop ; 切到内核栈
inc byte [gs:0] ; 改变屏幕第 0 行, 第 0 列的字符
mov al, EOI ; ┓reenable master 8259
out INT_M_CTL, al ; ┛
push clock_int_msg
call disp_str
add esp, 4
mov esp, [p_proc_ready] ; 离开内核栈;
lea eax, [esp + P_STACKTOP]
mov dword [tss + TSS3_S_SP0], eax ;进程在运行之前 TSS.ESP0指向了当前进程表的 REGS 末尾
pop gs ; ┓
pop fs ; ┃
pop es ; ┣ 恢复原寄存器值
pop ds ; ┃
popad ; ┛
add esp, 4
iretd
完成进程切换:
ALIGN 16
hwint00: ; Interrupt routine for irq 0 (the clock).
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] ; 改变屏幕第 0 行, 第 0 列的字符
mov al, EOI ; ┓reenable master 8259
out INT_M_CTL, al ; ┛
inc dword [k_reenter]
cmp dword [k_reenter], 0
jne .re_enter
mov esp, StackTop ; 切到内核栈
sti
push 0
call clock_handler ;中断里面修改p_proc_ready,会导致TSS里面的ESP值改变,
; 中断返回时,根据TSS里面的ESP值恢复寄存器的值,就会导 致 进 程切换
add esp, 4
cli
mov esp, [p_proc_ready] ; 离开内核栈;
lldt [esp + P_LDT_SEL]
lea eax, [esp + P_STACKTOP]
mov dword [tss + TSS3_S_SP0], eax
.re_enter: ; 如果(k_reenter != 0),会跳转到这里
dec dword [k_reenter] ; k_reenter--;
pop gs ; ┓
pop fs ; ┃
pop es ; ┣ 恢复原寄存器值
pop ds ; ┃
popad ; ┛
add esp, 4
iretd
posted on 2014-09-22 19:38 wanghj_dz 阅读(1542) 评论(0) 编辑 收藏 举报