LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1570|回复: 7

???对栈很是迷惑???

[复制链接]
发表于 2006-1-4 17:04:10 | 显示全部楼层 |阅读模式
看了内核代码,对栈很是迷惑。
1。什么时候使用内核态栈,
2。什么时候使用用户态栈
3。什么时候发生栈切换??
4。如果发生任务a切换到任务b运行,那么对应两个任务
的用户态栈和内核态栈中的内容有什么变化??
5。如果发生系统调用,用户态栈和内核态栈内容又会发生什么样的变化呢!??

6。main()
{
   functionA();
   fork();
}对应的相关栈都会发生什么变化??
发表于 2006-1-4 17:09:53 | 显示全部楼层
Post by macping
看了内核代码,对栈很是迷惑。
1。什么时候使用内核态栈,

当特权级切换到0时
2。什么时候使用用户态栈

当特权级为3的时候
3。什么时候发生栈切换??

当发生特权级切换和任务切换时
4。如果发生任务a切换到任务b运行,那么对应两个任务
的用户态栈和内核态栈中的内容有什么变化??

跟上次被中断时一样
5。如果发生系统调用,用户态栈和内核态栈内容又会发生什么样的变化呢!??

系统调用会从用户态进入核心态,最后再返回用户态,栈的变化如上
6。main()
{
   functionA();
   fork();
}对应的相关栈都会发生什么变化??

当fork执行到int 0x80或sysenter的时候,会切换到内核态
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-4 20:24:38 | 显示全部楼层
谢谢2楼的,但是我还想问就是1.什么时候发生特权及切换?
2.当发生特权级切换和任务切换时,栈怎么变化(内容怎么压入和弹出),请举例!
3。同一任务从用户态到内核态,栈的内容怎么变化??从内核态返回用户态,栈又是怎么变化?
   不同任务切换,对应栈又是怎么变化????请举例!
回复 支持 反对

使用道具 举报

发表于 2006-1-4 21:30:29 | 显示全部楼层
Post by macping
1.什么时候发生特权及切换?

中断/异常发生时

2.当发生特权级切换和任务切换时,栈怎么变化(内容怎么压入和弹出),请举例!

3-->0: cpu完成: eip,cs,eflags,esp,ss入栈
0-->3: iret指令执行上面那些寄存器的出栈工作
除此之外,内核自己还会做一些寄存器的入栈与出栈:

  1.      84 #define SAVE_ALL \
  2.      85     cld; \
  3.      86     pushl %es; \
  4.      87     pushl %ds; \
  5.      88     pushl %eax; \
  6.      89     pushl %ebp; \
  7.      90     pushl %edi; \
  8.      91     pushl %esi; \
  9.      92     pushl %edx; \
  10.      93     pushl %ecx; \
  11.      94     pushl %ebx; \
复制代码

3。同一任务从用户态到内核态,栈的内容怎么变化??

与上面 3-->0 相同

从内核态返回用户态,栈又是怎么变化?

与上面 0-->3 相同

   不同任务切换,对应栈又是怎么变化????请举例!

  1.      15 #define switch_to(prev,next,last) do {                  \
  2.      16     unsigned long esi,edi;                      \
  3.      17     asm volatile("pushfl\n\t"                   \
  4.      18              "pushl %%ebp\n\t"                  \
  5.      19              "movl %%esp,%0\n\t"    /* save ESP */      \
  6.      20              "movl %5,%%esp\n\t"    /* restore ESP */   \
  7.      21              "movl $1f,%1\n\t"      /* save EIP */      \
  8.      22              "pushl %6\n\t"     /* restore EIP */   \
  9.      23              "jmp __switch_to\n"                \
  10.      24              "1:\t"                     \
  11.      25              "popl %%ebp\n\t"                   \
  12.      26              "popfl"                        \
  13.      27              :"=m" (prev->thread.esp),"=m" (prev->thread.eip),  \
  14.      28               "=a" (last),"=S" (esi),"=D" (edi)         \
  15.      29              :"m" (next->thread.esp),"m" (next->thread.eip),    \
  16.      30               "2" (prev), "d" (next));              \
  17.      31 } while (0)
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-5 08:39:15 | 显示全部楼层
回楼上的:你的答案中2。是指的在内核栈中的操作把。在此过程中,是不是用户栈不变化。?
不同任务切换,对应栈又是怎么变化????请举例!这个还是不太懂!
请版主总结一下,1。什么时候用到用户栈??什么时候一定用到用户栈??(在什么情况下的操作必定在用户栈上。)
                 2。什么时候用到内核栈?  什么情况下一定用到内核栈??(在什么情况下的操作必定在内核栈上。)
3。发生切换(栈切换??任务切换??)时,是在那个栈上作工作???
回复 支持 反对

使用道具 举报

发表于 2006-1-5 12:06:53 | 显示全部楼层
Post by macping
回楼上的:你的答案中2。是指的在内核栈中的操作把。在此过程中,是不是用户栈不变化。?
不同任务切换,对应栈又是怎么变化????请举例!这个还是不太懂!
请版主总结一下,1。什么时候用到用户栈??什么时候一定用到用户栈??(在什么情况下的操作必定在用户栈上。)
                 2。什么时候用到内核栈?  什么情况下一定用到内核栈??(在什么情况下的操作必定在内核栈上。)
3。发生切换(栈切换??任务切换??)时,是在那个栈上作工作???


1. 一般情况下,进程在用户态运行,自然使用用户栈
2. 当使用了中断指令(int指令)或者有硬件中断或cpu异常发生,则立刻从用户栈切换到内核栈(内核栈的信息从tss中读取),并在内核栈中保存eip,cs,eflags,esp,ss(这些寄存器都是发生中断或异常时用户态的信息,这里不讨论在内核态发生中断或异常的情况),这样系统就从用户栈切换到了内核栈
3. 当使用iret指令返回(到用户态)时,该指令从内核栈中读取ss,esp,eflags,cs,eip,将他们归位,这样,就又切换到了用户栈(因为保存的ss,esp都是用户栈的信息)

总结:
1. 在用户态时一定要使用用户栈,另外,在信号处理的时候,在内核态时也要操作用户栈
2. 在内核态(0特权级)时使用内核栈
3. 发生任务切换时,肯定在内核态,所以那时使用内核栈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-5 17:40:58 | 显示全部楼层
感谢版主。道理越讲越明,索性打破沙锅问到底。
1。用户态函数调用一定用到用户态栈,用户态函数调用可不可能用到内核态栈?(是不是只有通过系统调用使用)
2。内核态函数调用能调用用户态的函数么,如果调用也只能切换到用户态么??(感觉不能)
3。建议版主写一份关于操作系统内核以及应用程序对栈的用法的总结。感觉这方面是很多人的弱项。
回复 支持 反对

使用道具 举报

发表于 2006-1-5 19:06:11 | 显示全部楼层
Post by macping

1。用户态函数调用一定用到用户态栈,用户态函数调用可不可能用到内核态栈?

不可能
(是不是只有通过系统调用使用)

是的

2。内核态函数调用能调用用户态的函数么,如果调用也只能切换到用户态么??(感觉不能)

理论上可以,实际上不这么做

3。建议版主写一份关于操作系统内核以及应用程序对栈的用法的总结。感觉这方面是很多人的弱项。

其实这些内容在intel的文档中都有介绍(换个平台就不是这个样子了)
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表