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

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

转载于:https://www.cnblogs.com/wanghj-dz/p/3986583.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值