免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
21 [报告]
发表于 2011-10-17 11:38 |只看该作者
回复 19# embeddedlwp

所以prev需要分是哪个进程的栈上的局部变量,但是eax何时需要区分是进程A的还是进程C的?

论坛徽章:
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
22 [报告]
发表于 2011-10-17 11:40 |只看该作者
回复 20# asuka2001


    这个寄存器不就是所谓的“硬件上下文”嘛,比如上边的EIP,存在EIP_A,EIP_B,这样A切换回来了,才会切换到EIP_A指向的地方。

论坛徽章:
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
23 [报告]
发表于 2011-10-17 11:42 |只看该作者
所谓的进程的”硬件上下文“,它们是保存在栈上的,但是汇编中的eax,指代的可是实际的CPU寄存器,两个之间是有区别的!

论坛徽章:
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
24 [报告]
发表于 2011-10-17 12:10 |只看该作者
这里的“   :"m" (next->thread.esp),"m" (next->thread.eip),” esp为用户态进程堆栈栈顶,而内核态的是esp0,可以到thread_struct中去看看。这个作何解释阿!

论坛徽章:
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
25 [报告]
发表于 2011-10-17 19:37 |只看该作者
回复 24# embeddedlwp

就汇编代码来看thread.esp才是内核栈顶吧

从ULK3 P112中:

3. Saves the content of esp in prev->thread.esp so that the field points to the top of the prev Kernel Mode stack:
        movl %esp,484(%eax)
The 484(%eax) operand identifies the memory cell whose address is the contents ofe ax plus 484.

论坛徽章:
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
26 [报告]
发表于 2011-10-17 20:00 |只看该作者
本帖最后由 embeddedlwp 于 2011-10-17 20:02 编辑

回复 26# asuka2001


    请看linux 2.6.11的__switch_to的实现,__switch_to的作用就是硬件上下文切换(主要就是ESP0与IO许可权位图):
  1. struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
  2. {
  3.        
  4.         。。。。。。。。。。。。
  5.         /*
  6.          * Reload esp0, LDT and the page table pointer:
  7.          */
  8.         load_esp0(tss, next);

  9.         。。。。。。。。。。。。
  10. }


  11. static inline void load_esp0(struct tss_struct *tss, struct thread_struct *thread)
  12. {
  13.         tss->esp0 = thread->esp0;
  14.         /* This can only happen when SEP is enabled, no need to test "SEP"arately */
  15.         if (unlikely(tss->ss1 != thread->sysenter_cs)) {
  16.                 tss->ss1 = thread->sysenter_cs;
  17.                 wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0);
  18.         }
  19. }
复制代码
这里加载的是thread->esp0,而且《linux内核源代码情景分析》P265说“对于linux内核来说,TSS中有意义的就只剩下0级的堆栈指针,也就是SS0和ESP0两项了” 求指点!

论坛徽章:
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
27 [报告]
发表于 2011-10-17 20:01 |只看该作者
单看这个宏不行,得结合调用函数看,就明白了.

论坛徽章:
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
28 [报告]
发表于 2011-10-17 20:03 |只看该作者
回复 28# chishanmingshen


    http://blog.csdn.net/yunsongice/article/details/5515965 这个blog上也像我说的那样。求指点!

论坛徽章:
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
29 [报告]
发表于 2011-10-17 20:10 |只看该作者
start_kernel()->trap_init()->cpu_init():
  1. void __init cpu_init (void)
  2. {
  3.         int cpu = smp_processor_id();
  4.         struct tss_struct * t = &per_cpu(init_tss, cpu);
  5.         struct thread_struct *thread = &current->thread;
  6.         。。。。。。。。。。。
  7.         load_esp0(t, thread);
  8.         set_tss_desc(cpu,t);
  9.         load_TR_desc();
  10.         load_LDT(&init_mm.context);
  11.         。。。。。。。。。。。。
  12. }
复制代码

论坛徽章:
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