免费注册 查看新帖 |

Chinaunix

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

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

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

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

>>linux是可以抢占的,只是在进程运行在用户态时才可以被抢占,在内核态是不可以被抢占的。
看书看代码
>>清空栈的操作也就把esp指到栈顶就行了,我以前好象哪儿看到过,现在找不到在哪儿了
移动esp并不能清空内存页。所以我说是没有清空的

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

>>linux是可以抢占的,只是在进程运行在用户态时才可以被抢占,在内核态是不可以被抢占的。
看书看代码
>>清空栈的操作也就把esp指到栈顶就行了,我以前好象哪儿看到过,现在找不到在哪儿了
移动esp并不能 ...



看什么书?
对于堆栈来说,把esp置顶了,就算清空了。

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



看什么书?
对于堆栈来说,把esp置顶了,就算清空了。

随便找本讲2.6的书就可以了。
>>对于堆栈来说,把esp置顶了,就算清空了
乱说

论坛徽章:
0
14 [报告]
发表于 2009-06-09 12:37 |只看该作者

回复 #13 zx_wing 的帖子

你说的"清空"和cucer_2的"清空"不一样,cucer_2说的"清空"是指针对kernel space的栈要不要回收这个意思,就是roll back栈指针的"清空".而估计你说的memset(0)这种清空一般是对栈进行一个初识话的清空,一般是在一个函数的开始而不是结束.还有,kernel space是不能被抢占的,除了中断和自己主动让出cpu.而icer_2说的"抢占"这里指的是被另一个进程给抢占,所以可以说kernel不可抢占

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

随便找本讲2.6的书就可以了。
>>对于堆栈来说,把esp置顶了,就算清空了
乱说


我知道2。6内核是可抢占的内核,在内核中设置了一些抢占点,不过对我的这个问题来上,没有什么用处。
从进程从内核返回到用户态,esp置顶,当它再次进入内核操作,对堆栈来说,不是相当于以前的堆栈被清空了?

论坛徽章:
0
16 [报告]
发表于 2009-06-09 12:43 |只看该作者

回复 #15 cuer_2 的帖子

我个人觉得讨论从kernel space返回到user space栈会不会"回收"(如果是你的这个清空的意思的话)没什么意义啊,就算不清空,每次从user space进入kernel space时都从栈顶开始就OK了阿.
如果不清空你觉得有什么后果?

论坛徽章:
0
17 [报告]
发表于 2009-06-09 12:51 |只看该作者
原帖由 snail_314 于 2009-6-9 12:37 发表
你说的"清空"和cucer_2的"清空"不一样,cucer_2说的"清空"是指针对kernel space的栈要不要回收这个意思,就是roll back栈指针的"清空".而估计你说的memset(0)这种清空一般是对栈进行一个初识话的清空,一般是在一个 ...

>>还有,kernel space是不能被抢占的,除了中断和自己主动让出cpu.而icer_2说的"抢占"这里指的是被另一个进程给抢占,所以可以说kernel不可抢占
还是那个建议,看书。不然翻精华帖也可以。

>>你说的"清空"和cucer_2的"清空"不一样,cucer_2说的"清空"是指针对kernel space的栈要不要回收这个意思,就是roll back栈指针的"清空".而估计你说的memset(0)这种清空一般是对栈进行一个初识话的清空,一般是在一个函数的>>开始而不是结束.
“roll back栈指针”,如果你们把这个理解为“清空”的话,那你们对x86下进程切换栈指针寄存器esp的值是从哪里来,怎么来的还不清楚。不会roll back栈指针,所有运行在x86上的操作系统都不会roll back栈指针,因为这是个多余的操作。可以参考ULK之类的内核书籍看看内核栈切换的过程,看了后这个问题就清楚了。

“清空”,特别是在涉及到内核页面时,指的就是用类似memset方法把物理页面清0。这多是出于安全目的的考虑。所以“清空”和栈指针的变化没有关系。

[ 本帖最后由 zx_wing 于 2009-6-9 12:53 编辑 ]

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


我知道2。6内核是可抢占的内核,在内核中设置了一些抢占点,不过对我的这个问题来上,没有什么用处。
从进程从内核返回到用户态,esp置顶,当它再次进入内核操作,对堆栈来说,不是相当于以前的堆栈被清空了?

>>从进程从内核返回到用户态,esp置顶,当它再次进入内核操作,对堆栈来说,不是相当于以前的堆栈被清空了?
“清空”的意思我在LS说了。这里没有清空。因为栈所在的页面还保存着上一次离开内核态时的内容。

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

>>从进程从内核返回到用户态,esp置顶,当它再次进入内核操作,对堆栈来说,不是相当于以前的堆栈被清空了?
“清空”的意思我在LS说了。这里没有清空。因为栈所在的页面还保存着上一次离开内核态时的内容。

难到每一个不用的页面回收的时候都要被清0才算是回收?

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

难到每一个不用的页面回收的时候都要被清0才算是回收?

你的问题明明问的是 “进程切换 它的系统堆栈会被清空吗?”,我的回答都是针对的你问题来的。
现在你又问回收,你的问题是不是变成“进程切换 它的系统堆栈会被回收吗?”,如果是,那答案是不会回收,直到进程死亡时才回收。

不过我估计你没有把进程切换时栈如何切换的过程搞清楚,所以问的问题也表达不清楚。还是那个建议,去看一本讲内核的书,把堆栈切换的过程(包括从用户态到内核态,还有内核抢占的情况)搞清楚了,你的问题自然就明白了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP