如何在Linux下为可执行文件分配堆栈?

时间:2015-02-26 08:49:21

标签: c++ c linux stack

在Linux下执行二进制文件(C / C ++)时

  1. 如何为流程初始化堆栈?
  2. 堆栈如何增长并达到什么限制?
  3. 使用ulimit,我可以设置一个限制号码,使用setrlimit,我可以修改它,但最多可以限制,我该如何确定?
  4. 是否为所有正在执行的进程分配了相同的堆栈大小?
  5. 正如您在下面的代码中所看到的,我只是递归调用func()进行推送操作,并且堆栈增长到大约8 MB左右。它崩溃了(堆栈溢出!)。

    void func()
    {
        static int i=0;
        int arr[1024]={0};
        printf("%d KB pushed on stack!\n",++i*sizeof(int));
        func();
    }
    
    int main()
    {
        func();
        return 0;
    }
    
    output snippet:
    
    8108 KB pushed on stack!
    8112 KB pushed on stack!
    8116 KB pushed on stack!
    8120 KB pushed on stack!
    Segmentation fault (core dumped)
    
    1. 这些大约8 MB来自哪里?

2 个答案:

答案 0 :(得分:2)

  1. 堆栈是在启动时与进程关联的各种内存区域之一,并且可能在运行时期间发生变化。其他可以是文本/代码,堆,静态/ bss等。
  2. 每次调用函数时,堆栈都会增长。在其上添加堆栈帧。堆栈帧是给定函数执行所必需的(参数,返回值,局部变量)。每次从函数返回时,堆栈都会以相同的量收缩。
  3. 您可以尝试估算调用树的功能有多深(f调用g,然后调用h,深度为3个调用,因此需要3个堆栈帧。< / LI>
  4. 是的,OS设计师估计有一个默认值。这个大小通常就足够了。
  5. 这是与您的操作系统相关联的默认常量。

答案 1 :(得分:2)

  
      
  1. 如何为其进程初始化堆栈?
  2.   

这取决于体系结构,但通常,内核在进程的VM中分配一些虚拟内存,并将堆栈指针寄存器设置为指向它的顶部。

  
      
  1. 堆栈如何增长并达到什么限制?
  2.   

每个函数调用都使用体系结构定义的过程在堆栈上保留更多空间。这通常被称为“功能序言”。

  
      
  1. 使用ulimit,我可以使用限制数量并使用setrlimit,我可以修改它但是达到了什么限制,我该如何确定?
  2.   

ulimit -s将告诉您当前进程(以及将继承此值的所有子进程,除非被覆盖)的最大堆栈大小(以KB为单位)。

  
      
  1. 是否为所有正在执行的进程分配了相同的堆栈大小?
  2.   

参见上一个答案。

相关: