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

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

例如 :

#include #include 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 ; } 

看,在这个程序中我使用静态,全局和malloc来分配动态内存那么,内存的布局将是……? 任何人给我的url,其中将包含有关此过程的详细信息..

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

布局:

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

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

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

更多信息:

这里有一个正在运行的ELF程序的良好描述,以及维基百科文章中有关格式本身的更多细节。 如果你想要一个关于编译器如何将C代码转换为汇编的例子你可能会看看GCC,他们的Internals Manual中有一些有趣的东西; 最相关的部分可能是第17章中的部分,尤其是17.10,17.19和17.21。 最后,英特尔在其IA-32架构软件开发人员手册中提供了大量有关内存布局的信息。 它描述了英特尔处理器如何处理内存分段和堆栈等的创建。 没有关于ELF的细节,但是可以看到两者匹配的位置。 最有用的位可能是第1卷:基础架构的第3.3节和第3A卷:系统编程指南第1部分的第3章。

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

维基百科上有一个简短的讨论。

这里稍微介绍一下 。

这里有更多详细信息,但我不确定它是否表现得非常好。

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

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

有关详细信息,请参阅此站点 。

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

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

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

只读

const int x = 10;

&读/写

char Str [] =“StackOverFlow”

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

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

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