我想知道内核是如何为简单的 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 来分配动态内存 那么,内存布局将如何......? 任何人给我 url ,其中将包含有关此过程的详细信息..
最佳答案
基本上,在以 ELF(可执行和可链接格式)为目标构建的 C 程序中,例如那些在 Linux 上构建的程序,会创建一个标准的内存布局。其他架构可能存在类似的布局,但我了解的还不够多,无法告诉您更多相关信息。
布局:
有一些全局数据部分在内存中的低内存地址处初始化(例如当前正在执行的代码的部分、全局数据以及使用 "..."
创建的任何字符串)在你的 C 代码中)。
在它下面有一堆可以使用的开放内存。随着调用 malloc 和 free 将所谓的“程序中断”移动到内存中更高的地址,此堆的大小会自动增加。
从内存中的高地址开始,堆栈向低地址增长。堆栈包含任何本地分配的变量的内存,例如函数顶部或范围内的变量 ({ ... }
)。
更多信息:
关于正在运行的 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 卷的第 3 章:系统编程指南,第 1 部分。
我希望这能帮助任何深入了解运行 C 程序内部的人,祝你好运。
关于C : Memory layout of C program execution,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2482255/