丰富中断程序,以及中断与进程运行的关系

进程A在运行,时钟中断发生。

中断会读取TSS中ring0的esp。该esp指向进程A进程表的regs的最后,并且把进程A运行的cs,eip,ss,sp,eflags等信息压入到esp指向的进程表。

执行中断程序

执行中断程序最后一个iredt指令,因为现在esp指向进程表的cs,eip等参数,所以会把刚刚保存进进程表的进程A的参数压出到寄存器。

返回到进程A继续执行。

--------------------------------------------------------------------------

其实,即便我们打开了时钟中断,时钟中断也只会发生一次,因为我们没有将中断结束位EOI置为1,

告知8259A当前中断结束。当前中断结束,才可以开始下一个中断。

hwint00:  ; Interrupt routine for irq 0 (the clock).
 sub esp, 4                                                               //中断会把cs,eip,eflags,ss,sp自动压入堆栈。跳过retAdrr成员
 pushad  ; `.                                                            //把所有e开头的寄存器压入堆栈
 push ds ;  |
 push es ;  | 保存原寄存器值
 push fs ;  |
 push gs ; /                                                              //把ds,es,fs,gs寄存器的值压入堆栈
 mov dx, ss
 mov ds, dx
 mov es, dx                                                             //使ss,ds,es的值相等。其实ss都是指kenel_ds,不同的是esp,不同的esp指向有可能是进程栈、内

                                                                                  核栈,进程表栈
 
 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]                                        ;注意esp还是指向进程表堆栈头,esp+P_STACKTOP指向进程表的regs尾
 mov dword [tss + TSS3_S_SP0], eax

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

 iretd

转载于:https://www.cnblogs.com/wanghj-dz/archive/2011/05/20/2052025.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值