(1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
系统栈(也叫核心栈、内核栈)是内存中属于操作系统
空间的一块区域,其主要用途为:
(1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出;
(2)保存操作系统子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。
用户栈是用户进程空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。
如果是gcc/linux的可执行文件,先用readelf看:
- $ readelf -l /bin/ls
- ...
- Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
- ...
- GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
- ...
复制代码如果MemSiz为零,则由OS决定栈的大小。
- $ ulimit -a | grep stack
- stack size (kbytes, -s) 8192
复制代码可以看到OS设定的值是8MB
编译时改变stack大小的方法:
ld --stack=栈尺寸
或
gcc -Wl,--stack=栈尺寸
例如 gcc -Wl,--stack=0x4000000
阅读(3020) | 评论(0) | 转发(0) |