为了检验地址空间中进程栈的大小,我们首先使用命令行查看了解进程栈的大小

对于进程地址空间中栈大小的检验 随笔 第1张

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

得知栈的大小是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函数

对于进程地址空间中栈大小的检验 随笔 第2张

我们发现main函数首先讲寄存器栈基址寄存器rbp压栈,然后讲rbp赋值为栈顶寄存器rsp,如果我们知道栈溢出的位置减去调用main函数时栈的位置也就是调用main函数的rsp(栈从高位向低位增长,main函数首先压栈rbp),就大概知道栈的大小,

使用gdb调试

gdb ./a.out

对于进程地址空间中栈大小的检验 随笔 第3张

约等于8196kb(8M),与系统所给的参数基本相符。

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄