【问题标题】:Memory Addresses: Linker Vs. Loader内存地址:链接器与。装载机
【发布时间】:2016-11-10 11:47:17
【问题描述】:

我试图了解内存分配在程序编译和加载的不同阶段是如何工作的。

1) 编译器和汇编器生成从地址 0 开始的代码和数据段。

2) 链接器通过关联内存位置来重定位这些段 使用每个符号定义,然后修改所有引用 到那些符号,使它们指向这个内存位置。

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

我的问题是关于两件事:

1)链接器分配的地址与加载器分配的地址有何关系。我们可以将链接器地址称为虚拟地址吗?

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

【问题讨论】:

    标签: process linker loader virtual-memory


    【解决方案1】:

    通常编译器会生成不从任何特定地址开始的可重定位代码。在某些情况下,这并不完全可能。例如

    int x ;
    int *y = &x ;
    

    这些需要特殊处理。

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

    加载器遵循链接器给出的指令。

    1)链接器分配的地址与加载器分配的地址有何关系。我们可以将链接器地址称为虚拟地址吗?

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

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

    在大多数系统中,程序的每次运行都会产生相同的逻辑地址布局。作为一种安全措施,这种情况变得越来越普遍。每次加载程序时,都会以不同的方式加载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-10
      • 2013-05-11
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 2021-01-07
      • 2011-12-11
      • 1970-01-01
      相关资源
      最近更新 更多