Chinaunix首页 | 论坛 | 博客
  • 博客访问: 168735
  • 博文数量: 35
  • 博客积分: 2067
  • 博客等级: 大尉
  • 技术积分: 282
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-31 10:29
文章分类

全部博文(35)

文章存档

2014年(3)

2011年(2)

2010年(20)

2009年(10)

我的朋友

分类: LINUX

2010-11-22 14:13:58

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

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

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

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

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

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

chinaunix网友2010-11-24 13:25:48

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com

chinaunix网友2010-11-24 13:25:48

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com