|
发表于 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. 发生任务切换时,肯定在内核态,所以那时使用内核栈 |
|