关注微信公众号 老卢私塾
堆、栈
先明白一点:一些教材上写的堆栈(stack)其实只是栈。
进程内存地址空间(内核ring0、用户ring3)
先说下静态数据区,一会再说栈、堆
static变量和全局变量的生命周期是一样的:从出生到程序结束。二者都存放在静态存储区。
本文只讨论ring3用户栈,以便与ring0内核栈区分开来。
内核栈是每个进程保留在内核内存中的内存区域,供(内核)内部函数调用时使用。用户栈驻留在不受保护(用户可操作)的用户内存中
l 堆heap
堆是先进先出的
堆空间的增长方向是从低地址向高地址增长
new,malloc/alloc是在堆上申请内存
堆的可用空间远大于栈空间
l 栈stack
栈是先进后出的
栈空间的增长方向是从高地址向低地址增长
栈的作用是局部变量(如函数实参)、函数call堆栈(调用函数时的寄存器信息)
每次调用函数时,会在栈上新分配一帧,每当函数返回时,再从栈上将此帧移去。
用专用寄存器:
1. ESP(栈顶指针)指向栈最上面一个栈帧的栈顶
2. EBP(栈底指针)指向栈最上面一个栈帧的底部
ESP-EBP=栈的大小
函数内的变量都可通过EBP加偏移量找到