栈(stack)是程序存放数据的内存区域之一,其特征是LIFO(Last In First Out,后进先出)式数据结构,即后放进的数据最先被取出。向栈中存储数据的操作称为PUSH(压入),从栈中取出数据称为POP(弹出)。
函数中的临时变量都被存储在栈上。此外在函数调用时,栈还用于传递函数参数,以及用于保存返回地址和返回值。
栈上依次保存了传给函数的参数、调用者的返回地址、上层栈帧指针和函数内部使用的自动变量。此外,处理有些函数时还会用栈来临时保存寄存器。每个函数都独自拥有这些信息,称为栈帧(stack frame)。此时需要适当的设置表示栈帧起始地址的帧指针(FP)。此外,栈指针(SP)永远指向栈的顶端。
注:x86_64重自动变量和工作空间可能会超过栈指针。从栈指针指向的地址开始,再次扩展128字节,这部分空间称为red zone(“危险区”),可以当做自动变量和工作空间使用。这是AMD64的ABI规格定义的内容。
栈帧在内存中如下分布:
SP ____
被调 | 工作空间
函 | 自动变量
数 | 上层FP
栈帧 __ | 返回地址
调函数 | 被调函数参数
的 | 工作空间
函 | 自动变量
数 | 上层FP
栈帧 __ | 返回地址
.......
查看当前进程的内存映射:
(gdb) info proc mapping
process 97308
Mapped address spaces: