当前位置: 技术问答>linux和unix
操作系统:关于任务切换,中断
来源: 互联网 发布时间:2017-03-24
本文导语: 在学习操作系统内核时,有一个问题一直困扰着我,找了很多资料都没有具体提及。 比如,当运行在优先级3的一个进程遇到时钟中断,势必会跳转到时钟中断函数,我想知道,在产生中断这一刻,CPU具体做了哪些事...
在学习操作系统内核时,有一个问题一直困扰着我,找了很多资料都没有具体提及。
比如,当运行在优先级3的一个进程遇到时钟中断,势必会跳转到时钟中断函数,我想知道,在产生中断这一刻,CPU具体做了哪些事,具体点就是CS,SS怎么变化,还有DPL,CPL怎么变化。我知道这当中跟TSS有关,具体加载TSS哪些东西。
还有就是,在处理完中断函数时切换到优先级1的进程,执行iretd指令时,CS,SS,DPL,CPL怎么变化,可以正常切换吗?
其实就是不同优先级代码之间的切换,关于优先级的检查。
希望高手指点,谢谢!
比如,当运行在优先级3的一个进程遇到时钟中断,势必会跳转到时钟中断函数,我想知道,在产生中断这一刻,CPU具体做了哪些事,具体点就是CS,SS怎么变化,还有DPL,CPL怎么变化。我知道这当中跟TSS有关,具体加载TSS哪些东西。
还有就是,在处理完中断函数时切换到优先级1的进程,执行iretd指令时,CS,SS,DPL,CPL怎么变化,可以正常切换吗?
其实就是不同优先级代码之间的切换,关于优先级的检查。
希望高手指点,谢谢!
|
中断打断进程:
进程正在执行一条指令,此时cs,eip指向下一个将要执行的指令,如果这时发生中断,那么CPU控制单元:
1、确定中断关联的向量,就是中断号,跟中断线对应的!
2、读idtr,其中存放的地址指向中断描述符表的对应中断号的位置,而中断描述符表,及IDT,中存放的是段选择符,对应的段描述符则指定了中断处理程序入口地址。
3、所以需要从gdtr寄存器获取GDT的基地址,再根据IDT中的段选择符中的index找到对应的段描述符。
4、将当前CS中描述CPL的两位与 对应中断处理程序的段描述符的DPL进行比较,如果 CPL小于DPL,证明中端的特权低于被中断的程序的特权,这样会产生一个“General protection”异常。
5、检查特权级是否发生变化,即CPL是否跟DPL不同,如果不同,则使用新的特权级相关的栈:
读tr寄存器,获取被中断进程的TSS段地址
用于新特权级相关的栈和栈指针装载ss,esp寄存器
在新的栈中保存ss,esp以前的值,这个就跟旧的栈相关连,以便恢复时回到初始位置。
6、在栈中保存eflags,cs,eip。
7、将中断处理程序入口地址装载cs,eip。地址见步骤2
8、跳转至中断处理程序。
中断处理完毕回到被中断的进程:
1、用上面保存在栈中的以前进程的寄存器值,填充cs,eip
2、同样弹出栈中保存的以前进程的栈寄存器值,填入ss,esp
这样就回到了原来的进程
进程正在执行一条指令,此时cs,eip指向下一个将要执行的指令,如果这时发生中断,那么CPU控制单元:
1、确定中断关联的向量,就是中断号,跟中断线对应的!
2、读idtr,其中存放的地址指向中断描述符表的对应中断号的位置,而中断描述符表,及IDT,中存放的是段选择符,对应的段描述符则指定了中断处理程序入口地址。
3、所以需要从gdtr寄存器获取GDT的基地址,再根据IDT中的段选择符中的index找到对应的段描述符。
4、将当前CS中描述CPL的两位与 对应中断处理程序的段描述符的DPL进行比较,如果 CPL小于DPL,证明中端的特权低于被中断的程序的特权,这样会产生一个“General protection”异常。
5、检查特权级是否发生变化,即CPL是否跟DPL不同,如果不同,则使用新的特权级相关的栈:
读tr寄存器,获取被中断进程的TSS段地址
用于新特权级相关的栈和栈指针装载ss,esp寄存器
在新的栈中保存ss,esp以前的值,这个就跟旧的栈相关连,以便恢复时回到初始位置。
6、在栈中保存eflags,cs,eip。
7、将中断处理程序入口地址装载cs,eip。地址见步骤2
8、跳转至中断处理程序。
中断处理完毕回到被中断的进程:
1、用上面保存在栈中的以前进程的寄存器值,填充cs,eip
2、同样弹出栈中保存的以前进程的栈寄存器值,填入ss,esp
这样就回到了原来的进程