通过内嵌汇编实现模拟时间片轮转多道程序的内核代码分析

刘昆

 +相关实验环境与代码源自:https://github.com/mengning/mykernel

 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

核心代码分析代码(时间片轮转分析)分析:

if(next->state == 0)/* -1 unrunnable, 0 runnable, >0 stopped */

    {

    /* switch to next process */

    asmvolatile(

        "pushl %%ebp\n\t"   /* save ebp */

        "movl %%esp,%0\n\t"/* save esp */   //保存当前进程堆栈现场状态

        "movl %3,%%esp\n\t"    /* restore  esp *///加载即将切换的新进程堆栈状态,进入新进程运行的堆栈状态

        "movl $1f,%1\n\t"      /* save eip *///保存当前进程EIP,即进程下次运行时的起点位置(注,label 1:位置)

       "pushl %4\n\t"       //即将切换的进程的EIP入栈

         "addl $1,%2"         //进程切换次数(个人添加,无关信息)

        "ret\n\t"           /* restore  eip */  //进程进入下一个进程

        "1:\t"                 /* next process start here */

        "popl %%ebp\n\t"       //弹出%%ebp,恢复之前保存的堆栈现场

       :"=m" (prev->thread.sp),"=m" (prev->thread.ip),"=m"(procee_switch_count)

       :"m" (next->thread.sp),"m" (next->thread.ip)

   ); 

   my_current_task = next; 

   printk(KERN_NOTICE">>>switch %d to %d<<<\n",prev->pid,next->pid);   

    }

   else

    {

        next->state =0;

        my_current_task = next;

        printk(KERN_NOTICE">>>switch %d to %d<<<\n",prev->pid,next->pid);

    /* switch to new process */

    asmvolatile(

        "pushl %%ebp\n\t"   /* save ebp */

        "movl %%esp,%0\n\t"/* save esp */   //保存当前进程堆栈现场状态

        "movl %3,%%esp\n\t"    /* restore  esp */

          "movl %3,%%ebp\n\t"    /* restore  ebp *///加载即将切换的新进程堆栈状态,进入新进程运行的堆栈状态

       "movl $1f,%1\n\t"      /* save eip 即进程下次运行时的起点位置*/

        "pushl %4\n\t"

          "addl $1,%2"

       "ret\n\t"           /* restore  eip */

       :"=m" (prev->thread.sp),"=m" (prev->thread.ip),"=m"(procee_switch_count)

       :"m" (next->thread.sp),"m" (next->thread.ip)

   );          

    }  

代码运行简易流程


代码运行实验截图



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值