2016-11-10 73 views
0

我想了解内存分配如何在编译和加载程序的不同阶段工作。内存地址:Linker VS.加载程序

1)编译器和汇编产生代码和数据段开始该地址为0

2)链接器通过存储器位置 与每个符号的定义相关联,然后修改所有的引用重新定位这些部分 到那些符号,以便它们指向这个内存位置。

3)加载程序将程序加载到主内存中,在进程的上下文中,因此,在这一步,分页和所有与内存管理相关的操作完成。

我的问题是两件事:

1)如何可通过与由装载机分配的那些链接指定的地址。我们可以调用链接器地址虚拟地址吗?

2)是否所有的程序具有相同的虚拟地址(即最终被映射到不同的物理地址?)

回答

0

一般来说编译器生成的重定位代码不会在任何特定的地址开始。有些情况下,这是不完全可能的。例如。

int x ; 
int *y = &x ; 

这些需要特殊处理。

链接器合并编译器引用的程序段。链接的输出是一个程序,指导加载程序如何将程序放在内存中。这些指示将处理上述情况。

加载程序按照链接器提供的说明进行操作。

1)链接器分配的地址与加载器分配的地址有什么关系。我们可以调用链接器地址虚拟地址吗?

链接器通常会生成可重定位代码,除非编译器或程序集产生了无法重定位的内容。链接器不会生成虚拟地址。

2)是否所有的程序具有相同的虚拟地址(即最终被映射到不同的物理地址?)

在大多数系统中,程序的每次运行产生相同的逻辑地址布局。作为一种安全措施,情况并非如此。每次程序加载时,它都会以不同的方式加载。