switch_to宏
在上一篇博客中总结了进程在内核态切换时所须做的工作,Linux实现时主要通过switch_to宏(汇编语言)实现:
pre和next分别指向切换前后两个进程的描述符.
switch_to宏:
- 将eflags 和ebp 寄存器里的值保存到prev进程的内核堆栈。(epb决定了变量空间,即变量pre和next是属于哪个进程)
- 将当前的esp保存到pre->thread.esp中。//save esp
- 将当前esp设为next->thread.esp。//reload esp
- 设置pre进程的EIP,即将标号为1的位置(该进程被切换回来后应该执行的第一条指令位置)保存到pre->thread中。//set pre's eip
- 将next->thread中保存的EIP存入内核栈,当从_ _switch_to( )返回后EIP就会被弹出。//This eip is set in step4 in most case,because next may be switched out before.
- 跳转到_ _switch_to( ) C函数执行。//用C语言编写,方便查看。
-
1: popl %ebp //恢复变量空间
popfl
- 将eax的值保存到pre。//保持进程该变量的正确性,例:A->B->C->B,最后B进程中的变量pre会等于C,而不是A。
_ _switch_to函数:(使用寄存器传递的参数)
- 如果pre使用过FPU的话,就保存FPU现场。
- 设置TSS段中内核堆栈入口指针为next进程的内核栈指针。
- 。。。
- 需要的话刷新TSS段的io_bitmap。
- return pre;
return pre 相关汇编指令:
movl %edi;,%eax //这样最近一次在cpu里执行的一个进程描述符会始终被保存到了eax中。
ret; (从内核堆栈中弹出EIP)
posted on 2009-10-11 21:42 just a beginner 阅读(381) 评论(0) 收藏 举报