免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: blake326
打印 上一主题 下一主题

[进程管理] switch_to源码疑问 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-06-05 14:35 |只看该作者
看来只有呼叫塑料袋dn了。

论坛徽章:
0
12 [报告]
发表于 2012-08-22 15:32 |只看该作者
pushfl                                 将eflags保存在待换出进程的内核栈上
pushl %%ebp                      将ebp寄存器的值保存在待换出进程的内核栈上
movl %%esp,%[prev_sp]      将当前堆栈指针值保存在current->thread.esp中
movl %[next_sp],%%esp      将待换入进程的thread.esp值加载到当前esp寄存器中完成内核栈的切换)
movl $1f,%[prev_ip]             将1标号的地址保存到current->thread.eip中,下次切换回来的时候从这里开始执行
pushl %[next_ip]                  将待换入进程的thread.eip值压入换入进程的内核栈中
jmp __switch_to                   调用__switch_to实现剩余的进程切换工作
从上条指令返回后从内核栈上弹出待换入进程的thread.eip值给eip寄存器。此时开始执行换入进程。
                  

1:                                      换出进程再次换入执行时的执行指令位置
popl %%ebp                     从进程栈中弹出ebp值
popfl                                从进程栈中弹出eflags

论坛徽章:
0
13 [报告]
发表于 2012-08-24 14:27 |只看该作者
我的理解:巧妙利用编译器特性实现按需保存。
在编译时,如果在分析switch_to前面的代码时,gcc已经将%ebx、%ecx、%edx、%esi、%edi这几个寄存器分配给其他的变量,由于此处要向寄存器写入值(变量ebx、ecx、edx、esi、edi的值写入对应寄存器),故gcc将被迫在asm块前部产生push、后部产生pop操作。又由于变量ebx、ecx、edx、esi、edi本身的值是不确定的,故相应的mov操作也被优化掉了。
这样的结果是,只有必要保存的寄存器值被保存,不相关的寄存器(没有被分配给变量的)值没有被保存。
也就是说,switch_to放在不同的上下文中会产生不同的代码,当然也可能恰好所有的寄存器都不需要保存,即不产生保存操作。

论坛徽章:
0
14 [报告]
发表于 2012-08-24 22:46 |只看该作者
回复 13# notyet


   好像有点道理啊。

论坛徽章:
0
15 [报告]
发表于 2012-08-31 16:18 |只看该作者
notyet 发表于 2012-08-24 14:27
我的理解:巧妙利用编译器特性实现按需保存。
在编译时,如果在分析switch_to前面的代码时,gcc已经将%ebx ...

你说的完全正确
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP