C:C程序执行的内存布局

时间:2010-03-20 07:04:35

标签: c

我想知道内核如何为简单的C程序提供内存。

例如:

#include<stdio.h> 
#include<malloc.h> 
int my_global = 10 ; 
main() 
{ 
char *str ; 
static int val ; 
str = ( char *) malloc ( 100 ) ; 
scanf  ( "%s" , str ) ;
printf( " val:%s\n",str ) ;
free(str) ;
return 1 ;
}

请参阅,在此程序中,我使用static,global和malloc来分配动态内存 那么,记忆的布局将是......? 任何人都给我网址,其中包含有关此过程的详细信息..

5 个答案:

答案 0 :(得分:6)

非常基本上,在针对ELF(可执行文件和可链接格式)构建的C程序中,例如那些构建在linux上的程序,创建了一个标准的内存布局。其他架构可能存在类似的布局,但我不太了解它们。

布局:

有些全局数据部分在内存中的低内存地址处初始化(例如当前正在执行的代码,全局数据以及在C代码中使用"..."创建的任何字符串的部分)。 / p>

下面有一堆可以使用的开放内存。这个堆的大小会随着对malloc的调用而自动增加,并将所谓的“程序中断”自由移动到内存中的更高地址。

从内存中的高地址开始,堆栈朝向较低地址增长。堆栈包含任何本地分配的变量的内存,例如函数顶部或范围内的变量({ ... })。

更多信息:

有关正在运行的ELF计划here的详细说明,以及the Wikipedia article上有关格式本身的更多详细信息。如果你想要一个关于编译器如何将C代码转换为汇编的例子你可能会看看GCC,他们的Internals Manual中有一些有趣的东西;最相关的部分可能是第17章中的部分,尤其是17.10,17.19和17.21。最后,英特尔在其IA-32 Architectures Software Developer’s Manual中提供了大量有关内存布局的信息。它描述了英特尔处理器如何处理内存分段和堆栈等的创建。没有关于ELF的细节,但是可以看到两者匹配的位置。最有用的位可能是第1卷:基本架构的第3.3节,以及第3A卷:系统编程指南第1部分的第3章。

我希望这可以帮助任何潜入C程序内部的人,祝你好运。

答案 1 :(得分:1)

wikipedia进行了简短的讨论。

稍长的介绍是here

更多详细信息here,但我不确定它是否展示得非常好。

答案 2 :(得分:1)

所有静态和全局变量都存储在数据段中,所有自动和临时变量都存储在堆栈中,所有动态变量都存储在堆上。

所有函数参数都存储在堆栈中,每个函数调用都有不同的堆栈帧,这就是递归函数的工作原理。

有关详情,请参阅this site

答案 3 :(得分:0)

实际上,当你运行任何一个C程序时,它的可执行映像会以一种有组织的方式加载到计算机的RAM中,称为进程地址空间或C程序的内存布局。

http://www.firmcodes.com/memory-layout-c-program-2/

答案 4 :(得分:0)

  • 所有静态和全局未初始化变量都进入bss(由符号开始的块)。
  • 所有初始化的全局/局部/静态变量进一步划分为

只读

  

const int x = 10;

&安培;读/写

  

char Str [] =&#34; StackOverFlow&#34;

  • 堆栈段是存储局部变量的区域。通过说局部变量意味着所有那些在C程序中包含main()的函数中声明的变量。

  • 文本段包含C程序的可执行指令,也称为代码段。这是要执行的程序步骤的机器语言表示,包括构成程序的所有功能,包括用户定义和系统。文本段是可共享的,因此只有一个副本需要在内存中用于不同的执行程序,例如文本编辑器,shell等。通常,文本段是只读的,以防止程序意外修改其指令。

  • 程序内存布局中的另一个区域是Unmapped或保留段包含命令行参数和其他程序相关数据,如可执行映像的较低地址 - 较高地址等。