刘昆
+相关实验环境与代码源自: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)
);
}
代码运行简易流程