您的位置:首页 > 运维架构 > Linux

Linux 2.6的switch_to函数的分析

2011-10-29 21:56 537 查看
好久没有更新博客了,这几天再追一个MM(性格很好,兵兵很喜欢,吼吼。),今天看了一下linux中的进程调度,下面把今天看的记录下一下。

其实最需要记录的是switch_to这个函数,这个函数主要是汇编组成。里面有一个最大的卖点就是如下:

"movl $1f,%[prev_ip]\n\t" /* save EIP */ \

"pushl %[next_ip]\n\t" /* restore EIP */ \

"jmp __switch_to\n" /* regparm call */ \

"1:\t" \

"popl %%ebp\n\t" /* restore EBP */ \

"popfl\n" /* restore flags */ \

这会把1f压入到prev->eip寄存器里面,等调用完__switch_to的时候就会调用ret指令,就会找当前内核栈ip也就是next->eip。也就是在返回的时候,返回的是之前next进程被切换的时候存入的到他的eip里面的1f,这个时候,就完完全全的到了next进程之前保存的空间里来了。这样就完成了进程切换。以后在调用prev进程(也就是现在prev是第二个参数),走完__switch_to之后,就会取出现在这里存在prev->eip中的1f了。这就是这个代码的玄机,其他的。。。好像看看大概都还好理解。

本文出自 “难得糊涂” 博客,请务必保留此出处http://hehedeng.blog.51cto.com/888740/701184
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: