为了检验地址空间中进程栈的大小,我们首先使用命令行查看了解进程栈的大小
得知栈的大小是8192kb,也就是8M.
那么实际情况也是如此吗?
为了验证我们使用无限递归的方式使得栈溢出,从而获得栈的大小。
1 void* ptr; 2 3 void blow_stack() { 4 blow_stack(); 5 } 6 int main() { 7 asm(" mov %%rsp, %0\n": "=r"(ptr)); 8 9 blow_stack(); 10 return 0; 11 }
编译完后使用
objdump -S ./a.out
查看汇编源码中的main函数
我们发现main函数首先讲寄存器栈基址寄存器rbp压栈,然后讲rbp赋值为栈顶寄存器rsp,如果我们知道栈溢出的位置减去调用main函数时栈的位置也就是调用main函数的rsp(栈从高位向低位增长,main函数首先压栈rbp),就大概知道栈的大小,
使用gdb调试
gdb ./a.out
约等于8196kb(8M),与系统所给的参数基本相符。