• 进程切换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
  • 相关阅读:
    POJ 3458 Colour Sequence(简单题)
    Cygwin下vim按方向键出现ABCD;
    算法之旅——归并排序
    poj 2769 Reduced ID Numbers(memset使用技巧)
    Restlet+Fastjson 高速构建轻量级 Java RESTful Webservice
    poj 1659 Frogs' Neighborhood (度序列)
    PHP监測memcache服务端的执行状况
    机器学习之倚门回首嗅青梅
    Threejs 官网
    sqlserver安全加固
  • 原文地址:https://www.cnblogs.com/cdwodm/p/5295453.html
Copyright © 2020-2023  润新知