Chinaunix首页 | 论坛 | 博客
  • 博客访问: 204194
  • 博文数量: 77
  • 博客积分: 1749
  • 博客等级: 上尉
  • 技术积分: 810
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-28 18:27
文章分类
文章存档

2012年(28)

2011年(49)

分类: LINUX

2011-11-16 10:15:26

>>为什么进程在内核空间有堆栈,作用是什么? 
进程在执行系统调用或被中断时,进入内核空间,内核中的程序执行如局部变量、函数调用等都需要堆栈。作用和用户态下的堆栈作用是类似的。
进程的切换是在内核空间中完成的,每个进程都需要单独的堆栈来记录自己的上下文.

>>为什么每个进程都在内核空间有一个,不是共用一个?相关代码在什么地方? 
这是为了使每个进程都感觉自己在使用计算机的全部资源, 
但是这是一个虚拟的内存,共4G,实际使用的内存要视情况而定 
详细的介绍要看Linux的内存管理一节,很清楚

>>那不就没有地址保护了么?
在内核空间中执行代码的 安全性本来就决定于内核开发者和模块开发者。开发者会注意堆栈问题的。不会一次push进很多东西(比如很大的数据结构),这样会破坏进程结构task_struct,当然内核开发者不会犯这样的错误。
假设一个进程正在用户态下运行,各积存器(eax,ebx,ecx,esi,edi……)的值都是用户态进程的上下文,这时发生了一个中断(如时钟中断或执行了一个系统调用),那么中断处理程序会改这些积存器,当中断执行完后这些积存器怎么恢复? 
靠的是核心栈,中断程序的一开始我们执行一个SAVEALL,把这些积存器保存在核心栈中,中断结束返回前我们执行一个POPALL将保存在栈中的值弹出到各寄存器。 
中断发生时会进行一个栈的切换,会将esp置成tss->esp0,在2.4内核中就是task struct中的thread->esp0,也就是我们所说的核心栈。 
中断完成后返回时也会进行一个栈切换,将esp置成tss->esp,这个是用户栈。 
以上两个切换都是由硬件完成的。 
也许你认为核心栈在上面这个例子中发挥的作用并不是很大,可以用其他办法来模拟。 
但是中断发生后有可能进行进程切换,想象一下如果有100个进程切来切去是不是就不好管理了,如果每个进程都将有自己的硬件上下文保存在核心栈中,管理起来就方便多了,很容易就能恢复一个进程的执行。 

参考资料:
阅读(1187) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~