免费注册 查看新帖 |

Chinaunix

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

关于switch_to()这个函数的疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-17 19:48 |只看该作者 |正序浏览
在看switch_to()这个函数的时候,有点疑惑,就是为什么第三个参数last要指向刚刚被切换掉的那个进程呢?
这样有什么用吗? 反正这个进程暂时就不用了,指向它有什么微妙之处吗?
谢谢.

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
38 [报告]
发表于 2011-10-18 08:38 |只看该作者
顶起来! {:3_201:}

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
37 [报告]
发表于 2011-10-17 20:39 |只看该作者
我只能估计这个是用于当系统从用户空间跳转到到内核空间时,比如中断或者系统调用,由于需要使用内核栈,linux的解决办法是使用当前CPU上正在运行的进程的内核栈。

所以每次进程切换时把进程的内核栈保存到esp0里,然后扔到tss里去。这样用户空间跳转到内核空间时,就把tss里的esp拿来往esp寄存器一装,栈就算切换好了。

这个只是个人推测,是对是错就不清楚了。。。还是坐等高人指点吧!

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
36 [报告]
发表于 2011-10-17 20:34 |只看该作者
这个我也不清楚,需要高人来指点了!

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
35 [报告]
发表于 2011-10-17 20:30 |只看该作者
回复 30# chishanmingshen


    问24楼!

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
34 [报告]
发表于 2011-10-17 20:30 |只看该作者
本帖最后由 embeddedlwp 于 2011-10-17 20:33 编辑

回复 33# asuka2001


    情景分析中有这样一段,是否这个esp0,ss0有什么特殊意义,请指点!:

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
33 [报告]
发表于 2011-10-17 20:23 |只看该作者
3. Loads next_p->thread.esp0 in the esp0 field of the TSS relative to the local CPU; as we'll see in the section I"ssuing a System Call via the
sysenter Instruction " in Chapter 10, any future privilege level change from User Mode to Kernel Mode raised by a sysenter
assembly instruction will copy this address in the esp register:
        init_tss[cpu].esp0 = next_p->thread.esp0;


在ULK3 P114中的描述也没有提到esp0和内核栈有关的任何字眼!

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
32 [报告]
发表于 2011-10-17 20:23 |只看该作者
回复 31# asuka2001


    奥,这样阿,那tss->esp0 = next->thread->esp0;有什么作用?

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
31 [报告]
发表于 2011-10-17 20:21 |只看该作者
  1. static inline void load_esp0(struct tss_struct *tss, struct thread_struct *thread)
  2. {
  3.         tss->esp0 = thread->esp0;
  4.         /* This can only happen when SEP is enabled, no need to test "SEP"arately */
  5.         if (unlikely(tss->ss1 != thread->sysenter_cs)) {
  6.                 tss->ss1 = thread->sysenter_cs;
  7.                 wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0);
  8.         }
  9. }
复制代码
没在这个函数内看到有将thread->esp0恢复到esp寄存器中的动作,怎么叫恢复硬件上下文???

switch_to宏中才是真正保存了eip和esp寄存器的值到内核栈上,这个才是保存硬件上下文。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
30 [报告]
发表于 2011-10-17 20:18 |只看该作者
不清楚你问啥,呵呵.
我博客里写过这个,你可以看看对你是否有帮助.
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP