函数的调用和返回使栈的增长和收缩呈线性。
专用寄存器---栈指针(stack pointer) , 用千跟踪当前栈顶。
每次调用函数时,会在栈上新分配一帧,每当函数返回时,再从栈上将此帧移去。
内核栈是每个进程保留在内核内存中的内存区域;
内核栈在执行系统调用的过程中供(内核)内部函数调用使用;
每个(用户)栈帧包括如下信息:
- 函数实参和局部变量:
由于局部变量都是在调用函数时自动创建的,因此在C 语言中称其为自动变量;
函数返回时将自动销毁这些变量(因为栈帧会被释放),这也是自动变量;
- (函数)调用的链接信息:
每个函数都会用到一些CPU 寄存器,比如程序计数器,其指向下一条将要执行的机器语言指令。
每当一函数调用另一函数时,会在被调用函数的栈帧中保存这些寄存器的副本,以便函数返回时能为函数调用者将寄存器恢复原状。
![](https://i-blog.csdnimg.cn/blog_migrate/a6e70602990946d733285b7ac1953206.png)
参考书籍:linux/unix编程手册