免费注册 查看新帖 |

Chinaunix

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

[内核入门] 内核堆栈 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-19 19:09 |只看该作者 |倒序浏览
内核态进程返回用户态后,内核栈是否清空?

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
2 [报告]
发表于 2014-03-19 19:55 |只看该作者
清空的啊。。。

论坛徽章:
0
3 [报告]
发表于 2014-03-19 22:03 |只看该作者
不需要

kernel mode有他自己的sp,以及他的內容都存在physical mem上

user mode也有他自己的sp,他的內容也是存到physical mem上

除非phy mem不足,才會把相關page移到disk上,否則都會在phy mem

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
4 [报告]
发表于 2014-03-20 10:32 |只看该作者
回复 1# stuman


    关键词是stack switch.

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
5 [报告]
发表于 2014-03-20 11:41 |只看该作者
不会清空的~

论坛徽章:
0
6 [报告]
发表于 2014-03-21 17:22 |只看该作者
是不会清空的。
当fork()一个进程后,系统会分配8k的空间作为进程控制块和内核栈空间使用。
建议楼主看下那个《linux内核源代码情景分析上册》的进程那一章节。
系统怎么管理这个进程呢?就是维护一个进程控制块和内核栈,如果进程每次的进出内核空间都分配和释放空间,那么势必会产生严重的进程管理实践开销。

论坛徽章:
0
7 [报告]
发表于 2014-03-24 21:48 |只看该作者
本帖最后由 studying_linux 于 2014-03-24 21:48 编辑

软件不用清空,但效果跟清空差不多吧。
每次做从用户态切换到内核态时,tss中的ss0和esp0会自动加载到ss和esp,就达到了内核栈的自动切换。而这个tss中的ss0和esp0是每个task初始化时写死的,所以每次从user mode switch 到 kernel mode时都会固定的切换到某个内存地址(栈地址)。

以上个人理解,不一定对。。。

论坛徽章:
0
8 [报告]
发表于 2014-03-25 12:08 |只看该作者
没有必要清空,因为栈空间是否分配其实可以看作栈指针的位置,如栈指针下移128字节,说明栈中存放了128字节。内核态切换到用户态时,内核栈中所有数据都被弹出,内核栈指针又变成了初始值,表明内核栈中没有数据了,这样避免了清空的步骤

论坛徽章:
0
9 [报告]
发表于 2014-03-25 15:14 |只看该作者
墙根下的水壶 发表于 2014-03-25 12:08
内核栈中所有数据都被弹出


我感觉不是这样哦,不是数据被弹出了吧。
数据应该都还在,只是下次再从用户态切入内核态的时候,这些数据是无意义了嘛,因为内核栈指针在每个task上是固定写死的。

个人理解,不一定对,请指正。。。

论坛徽章:
0
10 [报告]
发表于 2014-03-26 09:57 |只看该作者
回复 9# studying_linux

    客气了, 我们来交流一下:

    内核栈中的数据如果从内存的角度来看,确实是存在的,但是从栈的角度来看,他们已经不在栈里面了。

   其实你我的理解都没有错吧,当
(1)体系中没有单独的栈指针的时候,确实直接赋予其固定值会比较便捷;
(2)   当体系提供了独立的内核栈指针和用户栈指针时(cortax m3好象是这样),每次再去给内核栈指针赋值就不划来了,因为弹出栈中保存的系统调用上下文正好会使内核栈指针变为初始值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP