堆栈段

更新时间:2022-08-25 16:03

堆栈段,通常是指采用堆栈方式工作的一段内存区域。在采用段式内存管理方式进行程序内存分配的架构中,堆栈段用来存放局部变量和函数返回地址。

程序应用

堆栈段(stack segment)通常是指采用堆栈方式工作的一段内存区域。

当程序被执行时,程序可能会将其执行的状态加入栈的顶部;当程序结束时,它必须把栈顶的状态数据弹出(pop)。

堆栈段是在程序运行时动态分配使用,只需要通过栈顶指针即可访问。

大多数CPU中都有专用寄存器可以被用来存放栈顶地址。

堆栈段的作用

在采用段式内存管理方式进行程序内存分配的架构中,堆栈段用来存放局部变量和函数返回地址。堆栈段是在程序运行时动态分配使用,只需要通过栈顶指针即可访问。大多数CPU中都有专用寄存器可以被用来存放栈顶地址。

理论上,最小的栈可能是一个仅能保存函数调用(function call)地址的结构,以致被调用的函数能根据该地址返回(return)到原函数里。除此功能以外,开发者也可以将栈另作他用。

内存分配

基于栈的内存分配法的另一特点就是,当程序结束时,栈所用的内存能够自动快速地被回收,开发者不用干预,省心省力。如果栈顶的数据需要以某种格式被保存起来,那么在程序结束前,此数据必须被复制到其他位置,不然就会被弹出栈而丢失。因此,基于栈的内存分配法适用于那些只需暂时数据的保存情况。

操作系统给线程分配的栈可能仅为几个KB的大小。如果分配的栈内存过大,超过了线程实际需要,这可能导致栈溢出(stack overflow),以致系统崩溃。

x86处理器系列对线程栈的管理有特殊的指令。其他处理器系列(包括PowerPC和MIP)则没有这种支持。

堆栈段、数据段与代码段

堆栈段通常是指采用堆栈方式工作的一段内存区域。

在采用段式内存管理的架构中,数据段通常是指用来存放程序中已初始化且不为0的全局变量的一块内存区域。数据段属于静态内存分配。

代码段通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许程序自修改(self-modifying code)。 在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

操作系统在装载一个程序时会进行进程地址空间的分段,而代码段通常处于最底部,即最低地址部分,而堆和栈在高处,所以在允许代码段可写的架构上,当堆或栈内存溢出时,代码段中的数据就会开始被覆盖。

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}