核心栈

来源:互联网 发布:同花顺炒股软件 编辑:程序博客网 时间:2024/06/01 09:28

1、进程在内核空间中有堆栈,作用!?

进程在执行系统调用或 中断的时候,进入内核空间。内核中的程序执行(eg:局部变量、函数调用等)是需要堆栈的。

(作用和用户态下的堆栈的作用是类似的)

进程的切换是内核空间中完成的,每一个进程都需要单独的堆栈来记录自己的上下文。


2、为什么都需要单独的堆栈呢?

让每一个进程都是感觉到使用计算的全部资源,但是这是一个虚拟的内存,共4G,实际使用分配会视当前进程的情况而定。


3、地址保护问题!

内核空间中执行代码的安全性本来就决定于内核开发者和模块开发者。

开发者应该注意堆栈问题,不会一次push进很多东西(eg:数据接口),若是这样,会破坏进程结构task_struct 。

例子:

假设一个进程正在用户态下运行,各寄存器(eax,ebx,ecx,esi,edi……)的值都是在用户进程的上下文,若是此时发生一个中断,(eg:时钟中断或执行系统调用),那么中断处理程序会改变这些寄存器,中断执行完了之后,将会需要恢复。————>核心栈恢复

靠的就是核心栈,中断开始执行一个SAVEeALL(保存中断上下文),把这些寄存器的内容保存在核心栈中,中断结束就会执行POPALL将内容弹出到各个寄存器中,即为:寄存器恢复内容,

中断发生的切换:

中断发生时:一个栈的切换,会将esp置换成tss—>esp0,在linux2.4内核汇总就是task_struct汇总的thread—>esp0,也就是我们所说的核心栈。

中断完成后:一个栈的切换,将esp置换成tss—>esp ,这个是用户栈。

(这里的中断过程:切换栈都是在硬件中完成)


中断发生后可能进行进程切换,想象一下如果很多个进程(eg:100个),我们通过每一个 进程都将自己的硬件上下文保存在核心栈中,管理起来很方便,并且很容易恢复一个进程的执行。


补充:

(1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。

系统栈(也叫核心栈、内核栈)是内存中属于操作系统 空间的一块区域,其主要用途为:
              (1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出;
              (2)(程序间的子程序调用)保存操作系统子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。

   用户栈:是用户进程空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。
(似乎和程序间的第二点有点类似)

那么为什么不直接用一个栈,何必浪费那么多的空间呢??
(1)(若是只用用户栈),系统程序需要在某种保存下运行,系统进程不能够在用户空间中受到保护,而cpu处于核心态时是可以受到保护的。
(2)由于系统栈是有限的(如果只是用系统栈),中断一般有16个优先级(组成原理中讲到),系统一般大小为去15(只需保存15个低优先级的,另外一耳光高优先级的中断程序处于运行中);可以用户的程序调用很多,不能够-满足所以无法正常运行。

参考链接:
http://blog.csdn.net/hulihong/article/details/6436803












0 0
原创粉丝点击