您的位置:首页 > 编程语言

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

2015-03-13 16:15 274 查看
刘昆

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



代码运行实验截图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: