1. 什么是栈
1.1 栈
栈的作用域是进程。
在介绍栈之前,我们先来看下进程的结构
注 : 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大小的栈,会溢出
如果加大栈的空间大小,就可以正常的运行
2. 栈在内存中的map
我们通过查看当前运行进程,查看一下栈的分布地址
self 是当前进程
cd /proc/self/
cat maps
3. 栈溢出
如前面所述,在最大栈帧内,栈可以动态扩展
超过最大值,就会发生栈溢出,产生段错误
4. 栈帧
栈帧通俗的说,就是栈的范围。
比如第一个是 main 函数的栈帧区域, 包括 FP 和 LR
还有局部变量 函数参数 临时存储区
关于栈帧的使用,我会通过后续的一篇文章,来介绍在函数的调用过程中,栈帧是如何工作的。
100. 致敬
如有不详,请参考王老师的精彩讲解 堆栈管理
学习过程中,获得了极大的满足感,把之前的一些东西串联了起来。十分感谢 王利涛老师。
在此表示感谢。
PS:本文中所有的资源和图片均来自视频中
另外十分推荐一本书 深入理解计算机系统
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。