switch_to宏

在上一篇博客中总结了进程在内核态切换时所须做的工作,Linux实现时主要通过switch_to宏(汇编语言)实现:

       prenext分别指向切换前后两个进程的描述符.

switch_to宏:

  1. eflagsebp 寄存器里的值保存到prev进程的内核堆栈。(epb决定了变量空间,即变量prenext是属于哪个进程)
  2. 将当前的esp保存到pre->thread.esp中。//save esp
  3. 将当前esp设为next->thread.esp。//reload esp
  4. 设置pre进程的EIP,即将标号为1的位置(该进程被切换回来后应该执行的第一条指令位置)保存到pre->thread中。//set pre's eip
  5. 将next->thread中保存的EIP存入内核栈,当从_ _switch_to( )返回后EIP就会被弹出。//This eip is set in step4 in most case,because next may be switched out before.
  6. 跳转到_ _switch_to( ) C函数执行。//用C语言编写,方便查看。
  7. 1: popl %ebp     //恢复变量空间         

        popfl             

  8. 将eax的值保存到pre。//保持进程该变量的正确性,例:A->B->C->B,最后B进程中的变量pre会等于C,而不是A。
    

_ _switch_to函数:(使用寄存器传递的参数)

  1. 如果pre使用过FPU的话,就保存FPU现场。
  2. 设置TSS段中内核堆栈入口指针为next进程的内核栈指针。
  3. 。。。
  4. 需要的话刷新TSS段的io_bitmap。
  5. return pre;

   return pre 相关汇编指令:

    movl %edi;,%eax //这样最近一次在cpu里执行的一个进程描述符会始终被保存到了eax中。

    ret; (从内核堆栈中弹出EIP)

posted on 2009-10-11 21:42  just a beginner  阅读(381)  评论(0)    收藏  举报

导航