zoukankan      html  css  js  c++  java
  • 进程切换switch_to宏第三个参数分析

    进程切换一般都涉及三个进程,如进程a切换成进程b,b开始执行,但是当
    a恢复执行的时候往往是通过一个进程c,而不是进程b。

    注意switch_to的调用: switch_to(prev,next,prev), 可以看到last就是prev
    调用方法如下:进程A->进程B switch_to(A,B,A)主要有三个参数:
    输入参数两个:prev:切换前的进程 next:切换后的进程
    输出参数一个:last:切换前进程  注意这三个变量都是局部变量,
    在系统栈中,所以切换到另一进程后变量的值不会改变。
    进程a切换b之前,eax的值为prev,也就是a,edx的值为next,也就是b
    ebx的值为prev,也就是a
    当不考虑第三个参数时,从c切换成a,内核栈切换成a的栈,这时a中的prev和nexxt
    分别指向a和b,进程c的引用丢失了。
    这时第三个参数就派上用场了。
    c切换进程a后,将c存入eax中,切换到a后,由于输出部"=a" (last)会将eax的值
    写入last中,也就是prev中,所以此时prev和next的值就是c和b了。
    */
    #define switch_to(prev,next,last) do {     
     unsigned long esi,edi;      
     asm volatile("pushfl "  /* Save flags */ 
           "pushl %%ebp "     
           "movl %%esp,%0 " /* save ESP */  
           "movl %5,%%esp " /* restore ESP */ 
           "movl $1f,%1 "  /* save EIP */  
           "pushl %6 "  /* restore EIP */ 
           "jmp __switch_to "    
           "1: "      
           "popl %%ebp "     
           "popfl"      
           :"=m" (prev->thread.esp),"=m" (prev->thread.eip), 
            "=a" (last),"=S" (esi),"=D" (edi)   
           :"m" (next->thread.esp),"m" (next->thread.eip), 
            "2" (prev), "d" (next));    
    } while (0)
     
    转自:http://blog.chinaunix.net/uid-10585713-id-2947463.html
  • 相关阅读:
    联表查询更新
    SQLServer 中多行数据合并成一行数据(一个字段)
    换行和回车的区别
    SQL语句中使用回车换行符
    g2o使用总结
    求导总结
    ubuntu14.04 升级gcc
    如何入门SLAM
    imu和canmera标定
    使用velodyne16线激光雷达跑loam-velodyne------包括激光雷达和imu的标定
  • 原文地址:https://www.cnblogs.com/cdwodm/p/5295453.html
Copyright © 2011-2022 走看看