zoukankan      html  css  js  c++  java
  • 中断发生时寄存器的保存和恢复

    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

  • 相关阅读:
    C#制作在线升级程序
    C#中使用GUID的笔记
    C# WinForm 上传图片,文件到服务器的方法Uploader.ashx
    Java学习---多线程的学习
    Java学习---异常处理的学习
    Java学习---TCP Socket的学习
    Java学习---IO操作
    Java学习---JAVA的类设计
    Java学习---InetAddress类的学习
    Java学习---面向对象的远程方法调用[RMI]
  • 原文地址:https://www.cnblogs.com/wanghj-dz/p/3986583.html
Copyright © 2011-2022 走看看