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
  • 相关阅读:
    为Docker容器配置固定IP
    Docker CPU 资源限制——CPU分片功能测试
    Centos7下用命令下载jdk7及jboss-eap-6
    Docker CPU 资源限制——CPU固定核功能测试
    更改MySQL数据文件目录位置
    Linux下资源利用率监测利器—nmon使用
    图示-Centos7完整安装
    Photoshop图层混合模式计算公式大全
    HMC5883L地磁传感器驱动
    ADXL345加速度传感器驱动
  • 原文地址:https://www.cnblogs.com/cdwodm/p/5295453.html
Copyright © 2011-2022 走看看