`
LeslieWei
  • 浏览: 14110 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)怎样理解操作系统中“栈”的概念

阅读更多
从CPU角度来说的栈指的是CPU有个积存器SS,这个寄存器的低16 bit连同ESP一同指向下一次堆栈操作(push和pop)所要使用的堆栈地址。这个寄存器也可以被装入任意数值,你可以通过入栈和出栈操作来给他赋值,不过由于堆栈对于很多操作有很重要的意义,因此,不正确的修改有可能造成对堆栈的破坏。

/////////////////////////////////////////////////////////////////
从内存来说:(如下图)

操作系统代码  
                
系统DLL
内存映射文件

用户DLL

内存分配堆
进程堆栈

全局数据区
进程代码

DOS/win16
兼容区域

空指针区域

(说明):
从内存管理角度看,堆栈是就是一块连续的内存空间,对它的操作采用先入后出的规则,他的生长方向与内存的生长方向正好相反,也就是说它是从高地址向低地址生长.从Win32程序内部的角度看,每一个线程有自己的堆栈,它主要用来给线程提供一个暂时存放数据的区域,程序使用POP/PUSH指令来对堆栈进行操作.
堆栈里面都放什么东西:
堆栈中存放的信息包括:当前正在执行的函数的局部变量,函数返回地址,该函数的上层函数传给该函数的参数,EBP的值,一些通用寄存器(EDI,ESI…)的值,注意这里提到的正在执行的函数,比如有下面的一段C代码:
   void B()
   {printf(“B\n”);}
   void A()
   { B();}
   那么当程序执行到B函数的printf函数的时候我们说正在执行的函数包括A和B而不仅仅是B函数,这一点需要注意.
堆栈是什么时候建立起来的,大小是多少?
   堆栈是在我们的main主函数被系统调用之前被建立起来的,对于非主线程它是在线程被建立之前创建的,它的默认大小是1M,如果需要修改堆栈的大小的话可以在VC6++中通过使用/STACK编译项实现:
#pragma comment(linker,"/STACK:2048,1024"  // 预约(Reserve)2M,提交(Commit)1M
关于预约(Reserve)和提交(Commit)的概念请参看”Programming Applications for Microsoft Windows“( Jeffrey Richter,Chapter 15 Using Virtual Memory in Your Own Applications)
堆栈默认为1M,当我门的程序超过了1M怎么办?
系统通过使用异常捕获(Exception Handling)机制来捕获应用程序企图去访问超过该程序提交(Commit)的堆栈范围这种异常,假如你程序预约了2M并且提交了1M大小的堆栈,那么当你的程序企图访问超过1M的范围的时候会产生一个异常并且被系统捕获,系统会帮你继续从另外1M预约的内存中提交内存来满足你的需求,如果你要求提交的大小甚至超过了2M(你一开始预约的大小)在 NT系统下(98除外)系统也会尝试去分配(allocate)内存来满足你,但是系统并不保证分配会成功
什么叫stack frame?
Stack Frame这个词你可以在各种各样的汇编书籍中看到,到底它表示什么意思呢?也许你看完文章的后半部分就会明白,在此我们先给它一个定义,你看完我下面的例子就会知道它的确切含义了,Stack Frame是堆栈中的一块区域,它保存着一个函数的返回地址,和该函数内部使用的局部数据(Local Data),它是由函数入口处的SUB ESP,48h之类的语句来建立的.
在一次函数调用过程中,堆栈是如何操作的????
假设我们的主角叫A函数…
  a.首先上级函数传给A函数的参数被压入堆栈中(至于是谁来做这个压栈操作取决于A函数的调用方式:是__stdcall, __cdecl还是其他);
  b.然后是返回地址(A函数执行完后接下来程序继续执行的地址)入栈;
  c.接下来是当前的EBP;
  d.如果A函数有局部变量,就在堆栈中开辟相应的空间以构造那些变量变量(A函数执行结束,这些局部变量的内容将被忽略/遗弃,但是不被清除,比如A函数中有一个变量int m存在于地址0x0012FFCC处,函数结束时9依然存在于0x0012FFCC处没有被清除,但是此时它已经没有任何意义了, 
  e.在函数返回的时候,弹出EBP,恢复堆栈到函数调用前的地址,弹出返回地址到EIP以继续执行程序。
调用约定
在Win32中,有关函数的调用主要有两种约定。
1._stdcall
        以__stdcall方式调用的函数有以下特征:
    •  参数由右至左压栈
    • 调用返回时,堆栈由被调函数调整
2.__cdecl
__cdecl约定是C/C++函数的默认调用约定。它有以下特征:
    • 参数由右至左压栈
    • 调用返回时,堆栈由调用者调整
/////////////////////////////////////////////////////////

从数据结构角度来说,栈只是一种算法,先进后出。

以上说法都是针对WIN平台。
分享到:
评论

相关推荐

    操作系统基本概念——栈,堆,并发,进程

    答案:系统栈是内存中操作系统空间的一个固定区域;用户栈是内存中用户空间的一个区域。系统栈的作用:(1) 保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出;(2) 保存操作系统...

    考研操作系统习题和一些概念总结

    网络操作系统的概念也可能包含其中,如TCP/IP协议栈、网络模型(OSI七层模型或TCP/IP四层模型)以及网络安全问题。 学习操作系统时,理解并掌握这些知识点至关重要,它们不仅是考研的重点,也是实际工作中解决问题...

    操作系统概念习题与解析

    "操作系统概念习题与解析"这个资料包显然是针对操作系统理论的学习和理解而设计的,旨在帮助学生或自学者深入掌握操作系统的基本原理、设计和实现方法。以下是基于这一主题的详细知识点解析: 1. **操作系统定义**...

    操作系统概念 代码

    这份名为"操作系统概念 代码"的资源,显然是针对那些想要深入理解操作系统工作原理并进行实际操作的开发者或学生准备的。以下是基于这个主题的详细知识点: 1. **进程管理**:操作系统中的进程是程序执行的实例,...

    操作系统概念第七版习题答案中文版

    《操作系统概念》被誉为“龙书”,是操作系统领域的权威教材,尤其在第七版中,作者深入浅出地介绍了操作系统的核心原理和设计方法。这份习题答案中文版为学习者提供了宝贵的参考资源,帮助他们理解和掌握书中的关键...

    2023王道操作系统课件

    操作系统是计算机科学中的核心课程,对于计算机专业的学生来说,深入理解和掌握操作系统原理至关重要,尤其是在准备考研的过程中。2023年王道操作系统课件正是针对这一需求精心编排的资源,旨在帮助学生全面掌握操作...

    操作系统概念 第七版 中文 答案

    通过《操作系统概念》第七版的学习,我们可以深入理解这些概念,并借助提供的中文答案来检验和巩固自己的理解。这将对从事软件开发、系统管理或相关研究工作的人员大有裨益。同时,对这些知识的熟练掌握也能为解决...

    Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    Linux操作系统中的栈是一种重要的数据结构,尤其在内存管理、函数调用以及多任务处理中扮演着至关重要的角色。在Linux系统中,栈可以分为进程栈、线程栈、内核栈以及中断栈。 首先,我们需要了解栈(Stack)的基本...

    用c语言中栈实现数制转换

    其中,二进制、八进制、十进制和十六进制是最常见的数制,它们广泛应用于计算机系统的设计与操作中。在《用C语言中栈实现数制转换》这一主题中,我们探讨了如何利用栈这种数据结构来实现从十进制到其他进制(如八...

    操作系统概念第七版习题答案(中文版)完整版.rar

    3. **进程管理**:操作系统中的进程是执行中的程序实例,涉及的概念包括进程创建、撤销、并发执行、同步与通信等。理解这些概念对于分析多任务环境下的系统行为至关重要。 4. **内存管理**:内存管理是操作系统的...

    zigbee开源协议栈中的OSAL操作系统移植到12单片机

    标题和描述中提及的关键知识点包括了Zigbee开源协议栈、OSAL(Operation System Abstraction Layer)操作系统、移植到特定的单片机平台,以及相关的嵌入式系统概念。下面将详细说明这些知识点: 1. Zigbee技术:...

    操作系统设计与实现(Minix系统中文版).7z

    在书中,作者详细讲解了操作系统设计的基本概念,包括进程管理、内存管理、文件系统、设备驱动和网络协议栈等核心组件。这些内容对于理解操作系统的运行机制至关重要。进程管理涉及进程的创建、同步、通信和调度,是...

    分布式网络操作系统-从概念到实现

    在《分布式网络操作系统——从概念到实现》这本书中,读者可以深入理解这个领域的核心概念、分析方法、设计原则以及实际的实现技术。 首先,我们要理解分布式网络操作系统的定义。分布式操作系统是一种系统软件,它...

    操作系统精髓与设计原理课后答案(中文全)

    通过解答《操作系统精髓与设计原理》第五版的课后题目,读者能够更深入地理解这些概念,并能够将理论知识应用到实际问题中。这本书的中文全解将帮助中国学生克服语言障碍,更好地吸收和掌握操作系统的核心知识。

    获得系统安装的各协议栈信息

    在IT领域,协议栈是操作系统的核心组成部分,它负责网络通信的规范和标准。协议栈,通常指的是TCP/IP协议栈,但也可以包括其他如OSI模型中的协议层。本实例主要关注的是如何获取并展示系统中安装的各种协议栈信息。...

    c语言栈的进制转换

    在“栈的进制转换”程序中,我们可能会看到以下关键概念: 1. **栈的基本操作**:包括入栈(push)、出栈(pop)、查看栈顶元素(peek)和检查栈是否为空(isEmpty)。这些操作是实现进制转换的核心。 2. **进制...

    操作系统中的堆栈的经典解释

    通过对操作系统中堆栈概念的理解与实践,我们可以更加有效地管理和优化程序的内存使用。合理利用堆栈特性不仅可以提高程序的运行效率,还能避免常见的内存错误。此外,深入理解这些底层细节对于开发高质量的软件系统...

    操作系统概念第六版翻译版

    通过《操作系统概念》第六版翻译版的学习,读者不仅可以理解操作系统的基本原理,还能掌握如何在实际操作系统中应用这些原理,对于想要从事操作系统开发或相关领域工作的学生来说,是一本不可多得的参考书。

    操作系统教程第四版答案

    这部分还会讲解网络操作系统的概念,如网络协议栈、套接字编程,以及分布式系统的基本原理。 通过这四部分的学习,读者不仅可以掌握操作系统的核心概念,还能了解其设计原理和实现技术。对于准备考试或者深入研究...

Global site tag (gtag.js) - Google Analytics