免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2111 | 回复: 6
打印 上一主题 下一主题

进程调度的代码中switch_to函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-04 08:55 |只看该作者 |倒序浏览
进程调度的代码:
asmlinkage void __sched schedule(void)
{
     。。。。。。
   prev = context_switch(rq, prev, next);
    。。。。。。
}

static inline
task_t * context_switch(runqueue_t *rq, task_t *prev, task_t *next)
{
    。。。。。。
    /* Here we just switch the register state and the stack. */
    switch_to(prev, next, prev);

    return prev;
}

#define switch_to(prev,next,last) do {                                        \
        unsigned long esi,edi;                                                \
        asm volatile("pushl %%ebp\n\t"                                        \
                     "movl %%esp,%0\n\t"        /* save ESP */                \
                     "movl %5,%%esp\n\t"        /* restore ESP */        \
                     "movl $1f,%1\n\t"                /* save EIP */                \
                     "pushl %6\n\t"                /* restore EIP */        \
                     "jmp __switch_to\n"                                \
                     "1:\t"                                                \
                     "popl %%ebp\n\t"                                        \
                     :"=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)

我想问下,这个switch_to(prev, next, prev)执行后prev指向哪个进程,另外next从哪开始运行的

论坛徽章:
0
2 [报告]
发表于 2009-09-04 08:59 |只看该作者
自己顶,等牛人

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2009-09-04 10:20 |只看该作者
记得本版块scutan版主分析过这个函数。LZ搜一下

论坛徽章:
0
4 [报告]
发表于 2009-09-04 22:28 |只看该作者
我去网上搜搜去

论坛徽章:
0
5 [报告]
发表于 2009-09-05 02:53 |只看该作者
ULK3 里面好像有讲解这个函数的

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
6 [报告]
发表于 2009-09-05 11:21 |只看该作者
原帖由 accessory 于 2009-9-5 02:53 发表
ULK3 里面好像有讲解这个函数的


是的。记得scutan版主分析的时候,也这样说的。

BTW,accessory兄最近怎么样?

论坛徽章:
0
7 [报告]
发表于 2009-09-05 14:41 |只看该作者
从字面上看第一个参数prev和第三个参数last,感觉会有些模糊,因为他们明明是同一个变量,但又具有不同的意义

的确是这样的,但是进程切换的时候,你要分两个角度来想

1.对于即将要切出去的进程A,也就是在switch_to之前,prev就是自己,next就是下一个,而last就是prev,似乎没有存在的必要
从汇编上看,prev变量的值被放到了eax中。

2.对于切回来的进程B,也就是switch_to之后,进程切换已经完成了,现在是B在运行,而局部变量prev、last已经不是之前那个进程A的了,现在last变得有意义了,正如字面上的意思,它就是之前的进程,也就是刚被调度走的进程task_strcut结构指针,prev随同last一起改变了
但是别忘记B在刚切换出去的时候,局部变量prev和last跟前面的A一样,也是指向自己的,而这里需要将他们改变为之前进程描述符指针,从汇编上看last从eax中取出。

还要注意的是,当再次由switch_to切换到A进程运行的时候,prev和last就一定不是A了,但也不一定是B,应该称它为C,因为A被调度出去以后,B运行,但是再次调度的时候,不见得一定会回到A来

希望上面的解释还算清晰。

[ 本帖最后由 chenda0.03 于 2009-9-5 15:10 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP