中断发生时寄存器的保存和恢复

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编辑  收藏  举报

导航