免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cuer_2

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

论坛徽章:
0
发表于 2009-06-09 13:16 |显示全部楼层

回复 #17 zx_wing 的帖子

我在这里说"roll back"仅仅是说明这就是我们说的"清空",从上文的讨论来看,楼主说的应该是要不要"回收"栈.我主要是为了强调我们这里讨论的是要不要"回收"而已.而不是为了安全的"清空".所以,就算在代码中找到了类似memset(0)的代码,也不能回答楼主的问题,因为我们不是问的这个.至于要不要roll back,我后面也说了,觉得没必要,每次从user space进入到kernel space都重新load kernel stack top的值就行了.但是就算没有roll back操作,我每次进来时都是load的top stack的值,这不也叫"回收"么?因为上一次的stack已经不会使用啊.
还有,为什么说kernel space是可抢占的(我说的是完全可抢占哈),请指教.

论坛徽章:
0
发表于 2009-06-09 13:18 |显示全部楼层

回复 #20 zx_wing 的帖子

我们这里说的"回收"又和你说的fee_page那个把process的stack page给释放掉的回收不一样,你说的是把page回收到memory pool中,我们所说的是对于这个进程来说,进入kernel space后的它的kernel stack space是不是已经回收过了.

论坛徽章:
0
发表于 2009-06-09 13:36 |显示全部楼层
原帖由 snail_314 于 2009-6-9 13:16 发表
我在这里说"roll back"仅仅是说明这就是我们说的"清空",从上文的讨论来看,楼主说的应该是要不要"回收"栈.我主要是为了强调我们这里讨论的是要不要"回收"而已.而不是为了安全的"清空".所以,就算在代码中找到了类 ...

好了,我不跟你们争概念了,你们的问题我说了,只要把栈切换的过程搞清楚就明白了。
我这里给三条路径,分别把esp的值从哪儿来,如何加载写出来,上面说的所有问题都可以搞清楚。上论坛不一定要等到现成答案,只要找到回答问题的线索,自己摸索得出的结构记得最牢。
1. 用户态 --> 内核态
2. 内核态 --> 用户态
3. 内核态抢占发生时,栈的切换

把这三种情况下esp的值如何变化写出来,问题就明白了。

>>还有,为什么说kernel space是可抢占的(我说的是完全可抢占哈),请指教.
你上一个回复明明说的不能抢占

论坛徽章:
0
发表于 2009-06-09 13:37 |显示全部楼层
原帖由 snail_314 于 2009-6-9 13:18 发表
我们这里说的"回收"又和你说的fee_page那个把process的stack page给释放掉的回收不一样,你说的是把page回收到memory pool中,我们所说的是对于这个进程来说,进入kernel space后的它的kernel stack space是不是已 ...

如何搞清楚你的问题见LS的回复

论坛徽章:
0
发表于 2009-06-09 17:46 |显示全部楼层

回复 #1 cuer_2 的帖子

从内核态返回到用户态时,系统堆栈的内容都被pop出了,下一次进程从用户态切换成内核态时esp又指向栈顶(也即task_struct页面尾端)了。

论坛徽章:
0
发表于 2009-06-09 17:55 |显示全部楼层
没有吧,会把esp写到thread_info.esp中,他回来还要执行的,你把人家的内核栈给搞掉了,人家回来要得数据怎么办

论坛徽章:
0
发表于 2009-06-09 17:58 |显示全部楼层
1. 用户态 --> 内核态
从task_struct的thread_info中得到
2. 内核态 --> 用户态
保存在内核堆栈中
3. 内核态抢占发生时,栈的切换
从thread的一个esp中得到

论坛徽章:
0
发表于 2009-06-10 11:08 |显示全部楼层
完全清空,这个没的说。
这就定性的要求

论坛徽章:
0
发表于 2009-06-11 11:36 |显示全部楼层
内核栈是进程在内核模式下才用到的,但是在内核模式下的进程是不能被切换的,所以当切换发生时进程是在用户模式下的,内核栈中的数据没有意义,清空不清空都没有什么影响。

switch_to 宏执行进程的切换,并没有清空内核栈,只是把内核栈顶的指针保存到tss.esp中,这样这个进程被唤醒的时候把tss.esp的值载入到esp寄存器中,这样就指向的内核栈的栈顶

论坛徽章:
0
发表于 2009-06-11 11:36 |显示全部楼层
linux是可以抢占的,只是在进程运行在用户态时才可以被抢占,在内核态是不可以被抢占的。
清空栈的操作也就把esp指到栈顶就行了,我以前好象哪儿看到过,现在找不到在哪儿了

---------------------------------------
不懂就不要误人子弟好不好。你理解了抢占的概念在来说话。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP