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

进程在运行之前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

你可能感兴趣的:(byte)