免费注册 查看新帖 |

Chinaunix

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

在switch_to(prev,next,last)中esp内核堆栈的疑惑 [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-23 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-31 20:18 |只看该作者 |倒序浏览
我在看ULK第三章wicht_to宏时书上说
1. 把eflags和ebp寄存器内容压入prev所对应的内核栈栈顶:
    pushfl
    pushl %%ebp

2. 把esp的内容保存到prev->thread.esp中以使该字段指向prev内核栈的栈顶:
    movl %5,%%esp
    484(%eax)操作数表示内存单元的地址为eax内容加上484。

3. 把next->thread.esp装入esp。此时,内核开始在next的内核栈上操作,因此这条指令实际上完成了从prev向next的切换:
    movl next->thread.esp, %%esp

4. 向prev->thread.eip存入标记为1的地址。当被替换的进程重新恢复执行时,进程执行我们下面标记为1的那条指令:
    movl $1f, prev->thread.eip

5. 宏把next->thread.eip的值(绝大多数情况下是上面所述标记为1的地址)压入next的内核栈:
    pushl next->thread.eip

注意体会,当next执行完了以后的函数后,会回到这个栈的位置,执行eip对应的那条指令。

6.    跳到__switch_to()函数:
   jmp  __switch_to

7. 如干程序执行后,当A将再次获得CPU时,它执行一些保存eflags和ebp寄存器内容内容的指令,这两条指令的第一条指令被标记为1:
   1:
        popl %ebp
        popfl
问题:
其中第2,3步使用的的thread_struct->esp,我不明白thread_struct->esp不是应该放prev和next的用户态堆栈吗?它怎么会把esp放到了prev->thread.esp中,又怎么会把next->thread.esp装入esp。这里使用的都应该是内核栈啊,应该使用esp0才对嘛。
我自己也分析了一下,在使用switch_to时只可能是在内核态,第2步中把esp放t入prev->thread.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
2 [报告]
发表于 2014-07-30 21:24 |只看该作者
不明白。。。

论坛徽章:
0
3 [报告]
发表于 2014-07-30 22:21 |只看该作者
thread_struct->esp就是esp0。。。你去看代码

论坛徽章:
0
4 [报告]
发表于 2014-07-30 22:24 |只看该作者
内核态esp保存esp0.用户态保存用户态堆栈指针

论坛徽章:
0
5 [报告]
发表于 2014-07-30 22:28 |只看该作者
本帖最后由 黎明748 于 2014-07-30 22:29 编辑

。。谁挖的坟

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
6 [报告]
发表于 2014-08-05 10:43 |只看该作者
回复 1# chenjie901
你的代码读的很对,就有一点理解错了:
thread_struct结构里放的是进程系统态的信息,不是用户态的信息。thread_struct->esp放的是系统栈指针。切换的时候,先切换到新进程的系统栈,用户态的寄存器信息保留在系统栈顶部的一个pt_regs结构里,用户堆栈的指针也在这个里面。在返回用户空间时,新进程栈顶的pt_regs结构所含的context信息就被恢复,新进程得以运行。
所以切换是两步:
先切换到下一个子进程的系统栈,在从新进程的系统栈顶恢复用户态信息

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP