核心栈
来源:互联网 发布:同花顺炒股软件 编辑:程序博客网 时间: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)(程序间的子程序调用)保存操作系统子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。
- 核心栈
- windows核心编程---线程栈
- 【WIndows核心编程学习笔记】线程栈
- Windows核心编程(十五)线程栈
- 《Windows核心编程》之“线程栈”
- 《Windows核心编程》读书笔记十六 线程栈
- 《windows核心编程系列》十五谈谈windows线程栈
- 《windows核心编程系列》十五谈谈windows线程栈
- 深入Java核心:JVM中的栈和局部变量
- 《windows核心编程系列》谈谈windows线程栈
- 逆向工程核心原理学习笔记(十一):栈
- 逆向工程核心原理学习笔记(十一):栈
- 核心对象
- GT3核心
- 核心竞争力
- windows核心
- Ajax核心
- 核心瓶颈
- 用类的形式用链表排序
- UVA 11859 Division Game (Nim博弈)
- HDU2094 - 产生冠军 冠军: 总人数 - 失败过的人数 = 1
- UIKit结构图
- 网络篇 - 05.网络数据解析(XML)
- 核心栈
- Android Animation动画实战(一): 从布局动画引入ListView滑动时,每一Item项的显示动画
- Unity3D 调用Android原生方法
- Dotcms中文教程之一:管理(1.1、数据库配置)
- 网络篇 - 03.NSURLConnection应用场景
- Java设计模式---工厂模式
- C/C++笔记(二) 2015/8/15
- match_parent和fill_parent的区别
- android连接wifi相关知识