我想知道内核如何为简单的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来分配动态内存 那么,记忆的布局将是......? 任何人都给我网址,其中包含有关此过程的详细信息..
答案 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)
答案 2 :(得分:1)
所有静态和全局变量都存储在数据段中,所有自动和临时变量都存储在堆栈中,所有动态变量都存储在堆上。
所有函数参数都存储在堆栈中,每个函数调用都有不同的堆栈帧,这就是递归函数的工作原理。
有关详情,请参阅this site。
答案 3 :(得分:0)
实际上,当你运行任何一个C程序时,它的可执行映像会以一种有组织的方式加载到计算机的RAM中,称为进程地址空间或C程序的内存布局。
答案 4 :(得分:0)
只读
const int x = 10;
&安培;读/写
char Str [] =&#34; StackOverFlow&#34;
堆栈段是存储局部变量的区域。通过说局部变量意味着所有那些在C程序中包含main()的函数中声明的变量。
文本段包含C程序的可执行指令,也称为代码段。这是要执行的程序步骤的机器语言表示,包括构成程序的所有功能,包括用户定义和系统。文本段是可共享的,因此只有一个副本需要在内存中用于不同的执行程序,例如文本编辑器,shell等。通常,文本段是只读的,以防止程序意外修改其指令。