我想知道内核如何为简单的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 ;
}
Run Code Online (Sandbox Code Playgroud)
看,在这个程序中我使用静态,全局和malloc来分配动态内存那么,内存的布局将是......?任何人给我的网址,其中将包含有关此过程的详细信息..
基本上,在针对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程序内部的人,祝你好运.
| 归档时间: |
|
| 查看次数: |
6680 次 |
| 最近记录: |