免费注册 查看新帖 |

Chinaunix

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

[进程管理] schedule()为何最终都能回到所切换进程的执行流? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-07 21:43 |只看该作者 |倒序浏览
RT。。比如从A切换到B,为什么schedule()最终都能回到进程B的执行流。
让我奇怪的是,整个schedule函数都没看到保存上一个进程的EIP的操作。
恳请各位回答!

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2013-12-08 21:49 |只看该作者
没看代码,但
JMP TSS会保存现在程序的所有寄存器到TSS段,包括EIP,

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
3 [报告]
发表于 2013-12-09 00:02 |只看该作者
各自arch里面不同的switch_to函数实现。

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
4 [报告]
发表于 2013-12-09 00:37 |只看该作者
本帖最后由 smalloc 于 2013-12-09 00:43 编辑

EIP似乎不需要管,每个进程做切换必然是在此进程的内核态调用同一调度函数,即运行相同的程序段,那么这个进程被“切换”出去的指令瞬间,和切换回来的指令瞬间必然是相接的,事实上也不存在强制的分界,而可以把调度函数相同代码的任意位置做为分界。
你所问的EIP保存实际隐含在调用调度函数的环境建立前完成,比如用户空间调用调度函数或被定时器抢占进入内核态调用调度函数,都已经完成了自身任务的EIP保存。而在内核太被强占调度也一样。内核态自调用调度函数则无须保存,因为切换回来时,代码是平滑的从调度函数退出回到内核路径执行。
遇见请指正。

论坛徽章:
0
5 [报告]
发表于 2013-12-09 10:44 |只看该作者
smalloc 发表于 2013-12-09 00:37
EIP似乎不需要管,每个进程做切换必然是在此进程的内核态调用同一调度函数,即运行相同的程序段,那么这个进 ...


我懂了,谢谢你!因为内核栈中保存了返回信息,因此从schedule()返回后总是能回到新切换进来的进程调用schedule()时的位置,最后再从内核态回到用户态。

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
6 [报告]
发表于 2013-12-09 14:27 |只看该作者
本帖最后由 smalloc 于 2013-12-09 15:07 编辑

有一纰漏。
如果一定要有个进程与进程的分界线,那么stack的切换是就是进程切换的标志。
__switch_to中换了esp,那么这个指令前后的指令访问的是2个不同的stack,而schedule()函数换栈前后在后面的指令不应该依赖前面的栈空间(因为调度前后2代码的执行路径不同),但可改写。
i386中栈切换包含2个寄存器,esp和ebp, ebp的切换主要是保证schedule()返回后按新进程的schedule()入口返回。这里对EIP的操作似乎不产生影响
  1. #define switch_to(prev,next,last) do {                                  \
  2.         unsigned long esi,edi;                                          \
  3.         asm volatile("pushl %%ebp\n\t"                                  \
  4.                      "movl %%esp,%0\n\t"        /* save ESP */          \
  5.                      "movl %5,%%esp\n\t"        /* restore ESP */       \
  6.                      "movl $1f,%1\n\t"          /* save EIP */          \
  7.                      "pushl %6\n\t"             /* restore EIP */       \
  8.                      "jmp __switch_to\n"                                \
  9.                      "1:\t"                                             \
  10.                      "popl %%ebp\n\t"                                   \
  11.                      :"=m" (prev->thread.esp),"=m" (prev->thread.eip),  \
  12.                       "=a" (last),"=S" (esi),"=D" (edi)                 \
  13.                      :"m" (next->thread.esp),"m" (next->thread.eip),    \
  14.                       "2" (prev), "d" (next));                          \
  15. } while (0)
复制代码

论坛徽章:
0
7 [报告]
发表于 2013-12-09 17:15 |只看该作者
smalloc 发表于 2013-12-09 14:27
有一纰漏。
如果一定要有个进程与进程的分界线,那么stack的切换是就是进程切换的标志。
__switch_to中换 ...


恩好的,受教了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP