免费注册 查看新帖 |

Chinaunix

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

[进程管理] 进程从用户态陷入内核态时如何找到内核栈地址 [复制链接]

论坛徽章:
1
双鱼座
日期:2014-12-24 17:57:21
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-13 17:13 |只看该作者 |倒序浏览
进程从用户态陷入内核态时(例如中断或系统调用),需要切换esp指针,这时内核栈的地址存放在什么地方呢?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
2 [报告]
发表于 2015-08-13 20:15 |只看该作者
记不太清楚了,优先级切换是不是必须得经过任务门?如果是,就在TSS里。

论坛徽章:
1
双鱼座
日期:2014-12-24 17:57:21
3 [报告]
发表于 2015-08-13 21:07 |只看该作者
nswcfd 发表于 2015-08-13 20:15
记不太清楚了,优先级切换是不是必须得经过任务门?如果是,就在TSS里。

我也觉得是房子TSS中,但是在x86体系中,似乎每个CPU有一个TSS段,而不是每个进程有一个,这样进程切换的时候,就需要把内核栈的地址写入TSS段吧,这时候内核栈地址应该存放在什么地方呢?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
4 [报告]
发表于 2015-08-13 21:13 |只看该作者
是每个CPU一个,但它的内容好像是动态变化的?

没仔细看,貌似是进程切换的时候(switch_to)修改当前CPU的TSS的内容,指向将要被调度的新进程的内核栈。

论坛徽章:
1
双鱼座
日期:2014-12-24 17:57:21
5 [报告]
发表于 2015-08-13 21:26 |只看该作者
nswcfd 发表于 2015-08-13 21:13
是每个CPU一个,但它的内容好像是动态变化的?

没仔细看,貌似是进程切换的时候(switch_to)修改当前CP ...

刚才查了一下,好像就是这样。“当80x86的一个CPU从用户态切换到内核态时,它就从TSS中获取内核态堆栈的地址”。进程切换的时候,会把 task_struct->thread.esp0装入本地CPU的TSS的esp0字段,就是保存内核堆栈的地址了。

论坛徽章:
0
6 [报告]
发表于 2015-08-14 14:27 |只看该作者
说一下powerpc是怎么实现的吧,  每一个任务对应一个task机构,task结构中又中包含了一个thread_info结构和thread结构。

thread_info分配的时候分配了两个页面,也就是8K大小,起始两端地址分别对应的内核态堆栈的和thead_info结构的开始。

然后再thread结构中有一个sp的指针变量指向上面分配的内核堆栈栈顶。

当linux从用户态进入到内核态的时候,因为用户态的堆栈只有虚拟地址,对应的页面还没有分配,所以要切换到内核堆栈,系统会利用current,得到当前任务的task描述符,特别要说明的是,powerpc用一个通用寄存器R2来保存current地址,以加速查找。 然后访问task结构的中thread结构rsp,current->thread->rsp. 然后把这个数值更新到对峙寄存器中,同时把用户态的寄存器压栈。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP