虚拟内存[02] Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈【转】
转自: https://durant35.github.io/2017/10/29/VM_Stacks/ Linux 中有几种栈?各种栈的内存位置? 关于栈 函数调用栈的典型内存布局 栈帧 (Stack Frame) 的边界由栈帧基地址指针 EBP 和 栈指针 ESP 界定, EBP 指向当前栈帧底部 (高地址),在当前栈帧内位置固定; ESP 指向当前栈帧顶部 (低地址); 当程序执行时, ESP 会随着数据的入栈和出栈而移动,因此函数中对大部分数据的访问都基于 EBP 进行。 栈帧存放着 参数 , 局部变量 及 恢复前一栈帧所需要的数据 等。 进程栈 进程虚拟地址空间中的栈区,正指的是我们所说的 进程栈 。 进程栈 是属于用户态栈,和 进程虚拟地址空间 (Virtual Address Space) 密切相关。 图: 32 位系统下进程地址空间默认布局(左)和进程地址空间经典布局(右) 进程栈 的初始化大小是由编译器和链接器计算出来的,但是栈的实时大小并不是固定的,Linux 内核会根据入栈情况对栈区进行动态增长(其实也就是添加新的页表)。但是并不是说栈区可以无限增长,它也有最大限制 RLIMIT_STACK (一般为 8M),我们可以通过 ulimit 来查看或更改 RLIMIT_STACK 的值 ( stack size ): 1 2 3 4 5 6 7 8 9