Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1271525
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: LINUX

2011-04-27 18:52:12

假设一个进程正在用户态下运行,各积存器(eax,ebx,ecx,esi,edi……)的值都是用户态进程的上下文,这时发生了一个中断(如时钟中断或执行了一个系统调用),那么中断处理程序会改这些积存器,当中断执行完后这些积存器怎么恢复? 

靠的是核心栈,中断程序的一开始我们执行一个SAVEALL,把这些积存器保存在核心栈中,中断结束返回前我们执行一个POPALL将保存在栈中的值弹出到各寄存器。 

中断发生时会进行一个栈的切换,会将esp置成tss->esp0,在2.4内核中就是task struct中的thread->esp0,也就是我们所说的核心栈。 

中断完成后返回时也会进行一个栈切换,将esp置成tss->esp,这个是用户栈
。 
以上两个切换都是由硬件完成的。 

也许你认为核心栈在上面这个例子中发挥的作用并不是很大,可以用其他办法来模拟。 

但是中断发生后有可能进行进程切换,想象一下如果有100个进程切来切去是不是就不好管理了,如果每个进程都将有自己的硬件上下文保存在核心栈中,管理起来就方便多了,很容易就能恢复一个进程的执行。
====
阅读(1031) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~