orange's学习--第六章:b进程栈、进程表栈、内核栈的切换

        进程栈──进程运行时自身的堆栈。 
        进程表──存储进程状态信息的数据结构。 (在c语言中就是全局变量,在内核程序中把全局变量地址赋值给esp就是栈了)
        内核栈──进程调度模块(很复杂的中断程序处理本身任务使用的栈)运行时使用的堆栈。 

进程A本身运行时,esp指向本身进程设置的堆栈某个位置;

中断发生后,特权级也会发生变化从ring1跳到ring0,esp变成TSS预先设置好的ring0的esp的值(其实就是要求为进程表中进程A表项的最高地址,这个时候进行压栈处理,就会覆盖进程A表项的所有内容,达到了随时保存进程A的状态);这个时候如果中断程序进行堆栈操作就是破坏进程表数组;

在中断处理程序中设置把esp指向内核栈,这个时候中断处理程序就可以随便使用堆栈了;

中断处理程序:

ALIGN    16
hwint00:        ; Interrupt routine for irq 0 (the clock).      这个时候从ring1跳到ring0,通过TSS的0级esp指回进程A的进程A表项
    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
    out    INT_M_CTL, al        ; /  master 8259
    
    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     ;为下次从ring1跳到ring0做准备

    pop    gs    ; `.
    pop    fs    ;  |
    pop    es    ;  | 恢复原寄存器值
    pop    ds    ;  |
    popad        ; /
    add    esp, 4

    iretd

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值