1. 什么是栈

1.1 栈

栈的作用域是进程。
在介绍栈之前,我们先来看下进程的结构

clipboard.png

注 : stack 就是进程中的栈区域。

1.2 栈的作用范围

栈是C语言运行的基础。进程在运行时,可以不适用堆,但是必须使用栈。

栈主要作用于以下几个方面.

  • 函数参数
  • 局部变量
  • 函数返回值
  • 编译器生产的临时变量

1.3 栈指针

一般用 FP SP 来指向

栈一般是满减栈,FP 指向栈顶,SP 指向栈底。FP-SP 之间就是整个栈的大小。

跳转函数,通过移动FP,SP指针来重新划分新的栈。

1.4 栈的大小

可以通过以下命令查询和设置

ulimit -s

ulimit -s size (通过size 来设置,但是调高堆栈容量,会增加内存开销和启动时间)

栈的大小一般是8M (8192k)

定义一个 8M大小的栈,会溢出

clipboard.png

clipboard.png

如果加大栈的空间大小,就可以正常的运行

clipboard.png

2. 栈在内存中的map

我们通过查看当前运行进程,查看一下栈的分布地址

self 是当前进程
cd /proc/self/

cat maps

clipboard.png

3. 栈溢出

如前面所述,在最大栈帧内,栈可以动态扩展

超过最大值,就会发生栈溢出,产生段错误

4. 栈帧

clipboard.png

clipboard.png

栈帧通俗的说,就是栈的范围。
比如第一个是 main 函数的栈帧区域, 包括 FP 和 LR
还有局部变量 函数参数 临时存储区

关于栈帧的使用,我会通过后续的一篇文章,来介绍在函数的调用过程中,栈帧是如何工作的。

100. 致敬

如有不详,请参考王老师的精彩讲解 堆栈管理
学习过程中,获得了极大的满足感,把之前的一些东西串联了起来。十分感谢 王利涛老师
在此表示感谢。
PS:本文中所有的资源和图片均来自视频中
另外十分推荐一本书 深入理解计算机系统


天真真不知路漫漫
70 声望6 粉丝

1