C语言中内存分布及程序运行加载过程

C语言中内存分布及程序运行加载过程,第1张

一个程序内存分配:

下图是APUE中的一个典型C内存空间分布图(虚拟内存)

例如:

int g1=0, g2=0, g3=0

int max(int i)

{

int m1=0,m2,m3=0, p_max

static n1_max=0,n2_max,n3_max=0

p_max = (int )malloc(10)

printf("打印max程序地址\n")

printf("in max: 0xx\n\n",max)

printf("打印max传入参数地址\n")

printf("in max: 0xx\n\n",&i)

printf("打印max函数中静态变量地址\n")

printf("0xx\n",&n1_max)//打印各本地变量的内存地址

printf("0xx\n",&n2_max)

printf("0xx\n\n",&n3_max)

printf("打印max函数中局部变量地址\n")

printf("0xx\n",&m1)//打印各本地变量的内存地址

printf("0xx\n",&m2)

printf("0xx\n\n",&m3)

printf("打印max函数中malloc分配地址\n")

printf("0xx\n\n",p_max)//打印各本地变量的内存地址

if(i) return 1

else return 0

}

int main(int argc, char **argv)

{

static int s1=0, s2, s3=0

int v1=0, v2, v3=0

int p

p = (int )malloc(10)

printf("打印各全局变量(已初始化)的内存地址\n")

printf("0xx\n",&g1)//打印各全局变量的内存地址

printf("0xx\n",&g2)

printf("0xx\n\n",&g3)

printf("======================\n")

printf("打印程序初始程序main地址\n")

printf("main: 0xx\n\n", main)

printf("打印主参地址\n")

printf("argv: 0xx\n\n",argv)

printf("打印各静态变量的内存地址\n")

printf("0xx\n",&s1)//打印各静态变量的内存地址

printf("0xx\n",&s2)

printf("0xx\n\n",&s3)

printf("打印各局部变量的内存地址\n")

printf("0xx\n",&v1)//打印各本地变量的内存地址

printf("0xx\n",&v2)

printf("0xx\n\n",&v3)

printf("打印malloc分配的堆地址\n")

printf("malloc: 0xx\n\n",p)

printf("======================\n")

max(v1)

printf("======================\n")

printf("打印子函数起始地址\n")

printf("max: 0xx\n\n",max)

return 0

}

打印结果:

ELF目标文件格式的最前端是 ELF****文件头(****ELF Header****)

包含了描述整个文件的基本属性,如ELF版本、目标机器型号、 程序入口地址

3 加载:

计算机正在运行的程序存放在RAM(内存)里。

RAM是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。

它的组成是:内存是由内存芯片、电路板、金手指等部分组成的。

计算机运行程序:整个过程可以总结为编译、链接、装载、执行。

1、编译:编译过程又可以被分为两个阶段:编译、汇编。编译是指编译器读取字符流的源程序,对其进行词法与语法的分析,将高级语言指令转换为功能等效的汇编代码。汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。

2、链接:链接的主要内容是将各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接。

3、装载:程序在经过链接后,得到了可执行文件,下一步就需要将可执行程序加载到内存中。由于现代 *** 作系统均采用分页的方式来管理内存,所以 *** 作系统只需要读取可执行文件的文件头,之后建立起可执行文件到虚拟内存的映射关系,而不需要真正的将程序载入内存。

4、运行:加载器将可执行目标文件中的代码和数据从磁盘复制到内存中,然后通过跳转到程序的第一条指令或入口点来运行程序。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12193830.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存