免费注册 查看新帖 |

Chinaunix

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

进程切换 它的系统堆栈会被清空吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-09 08:44 |只看该作者 |倒序浏览
5可用积分
当进程发生切换了
当它再次被调度 此时它的系统堆栈中的数据还在吗?

论坛徽章:
0
2 [报告]
发表于 2009-06-09 09:01 |只看该作者
或者说进程从内核态向用户态转换时,内核态堆栈应该被清空了吧?

论坛徽章:
0
3 [报告]
发表于 2009-06-09 09:34 |只看该作者
当然没有被清空.假设sys_read系统调用在内核中是如下伪码:
sys_read:
  /* do something */
  int local = 1;
  if (/* no data avaliable */)
    do_sleep()
    local  ++;

do_sleep:
  schedule()

在schedule函数中就会做进程切换的动作.当下次回来时,从do_sleep返回后如果stack清空了那个local变量咋办...

论坛徽章:
0
4 [报告]
发表于 2009-06-09 09:55 |只看该作者
原帖由 snail_314 于 2009-6-9 09:34 发表
当然没有被清空.假设sys_read系统调用在内核中是如下伪码:
sys_read:
  /* do something */
  int local = 1;
  if (/* no data avaliable */)
    do_sleep()
    local  ++;

do_sleep:
  schedule ...


shcedule的调度也是在内核态内转换的
并没有从内核态跳转到用户态的吧
我想问的是从内核态向用户态转换,内核堆栈是否会被清空?

论坛徽章:
0
5 [报告]
发表于 2009-06-09 10:11 |只看该作者

回复 #4 cuer_2 的帖子

哦,你说的系统调用的返回阿.那应该是清空了的.毕竟system call的系统调用是sys_read的话,调用reti返回到user space也是从这个函数返回的啊.sp指针在返回前应该都pop了的.

论坛徽章:
0
6 [报告]
发表于 2009-06-09 10:22 |只看该作者
原帖由 snail_314 于 2009-6-9 10:11 发表
哦,你说的系统调用的返回阿.那应该是清空了的.毕竟system call的系统调用是sys_read的话,调用reti返回到user space也是从这个函数返回的啊.sp指针在返回前应该都pop了的.



不一定是系统调用
中断也可以
POP是和PUSH相对应的,能保证esp会回到堆栈的顶部吗?

论坛徽章:
0
7 [报告]
发表于 2009-06-09 10:41 |只看该作者
原帖由 cuer_2 于 2009-6-9 08:44 发表
当进程发生切换了
当它再次被调度 此时它的系统堆栈中的数据还在吗?

应该是没有清空的。
在返回userspace前最后几条指令还在使用栈上的内容,见restore_all。
---movb PT_OLDSS(%esp), %ah
>---movb PT_CS(%esp), %al
>---andl $(X86_EFLAGS_VM | (SEGMENT_TI_MASK << 8) | SEGMENT_RPL_MASK), %eax
>---cmpl $((SEGMENT_LDT << 8) | USER_RPL), %eax
>---CFI_REMEMBER_STATE
>---je ldt_ss>-->--->---# returning to user-space with LDT SS
restore_nocheck:
>---TRACE_IRQS_IRET
restore_nocheck_notrace:
>---RESTORE_REGS
>---addl $4, %esp>-->--->---# skip orig_eax/error_code
>---CFI_ADJUST_CFA_OFFSET -4
irq_return:
>---INTERRUPT_RETURN

论坛徽章:
0
8 [报告]
发表于 2009-06-09 10:47 |只看该作者
原帖由 zx_wing 于 2009-6-9 10:41 发表

应该是没有清空的。
在返回userspace前最后几条指令还在使用栈上的内容,见restore_all。


执行restore_all的时候还在内核态 并没有返回到用户态
没明白你的意思
而且进程在内核态不能被强占 我觉得没有必要在内核堆栈中保存信息

论坛徽章:
0
9 [报告]
发表于 2009-06-09 11:12 |只看该作者
原帖由 cuer_2 于 2009-6-9 10:47 发表


执行restore_all的时候还在内核态 并没有返回到用户态
没明白你的意思
而且进程在内核态不能被强占 我觉得没有必要在内核堆栈中保存信息

INTERRUPT_RETURN实际上是iret指令,这条指令执行完后就返回到用户态了。
如果有清空栈的操作,这个操作在什么地方做的?

>>而且进程在内核态不能被强占 我觉得没有必要在内核堆栈中保存信息
首先Linux是可以抢占,所以进程在内核态一样会被抢占。但这里和抢占没有关系。返回用户态和在内核栈保存信息没有关系,而是说返回后没有清空内核栈所在的物理页面。至少我没看到这个清空的操作发生在什么地方。

论坛徽章:
0
10 [报告]
发表于 2009-06-09 11:17 |只看该作者
原帖由 zx_wing 于 2009-6-9 11:12 发表

INTERRUPT_RETURN实际上是iret指令,这条指令执行完后就返回到用户态了。
如果有清空栈的操作,这个操作在什么地方做的?

>>而且进程在内核态不能被强占 我觉得没有必要在内核堆栈中保存信息
首先Linux是 ...

linux是可以抢占的,只是在进程运行在用户态时才可以被抢占,在内核态是不可以被抢占的。
清空栈的操作也就把esp指到栈顶就行了,我以前好象哪儿看到过,现在找不到在哪儿了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP