关于地址绑定的混淆

时间:2016-04-24 08:46:49

标签: operating-system compile-time execution-time load-time

编译时间。如果您在编译时知道进程将驻留的位置 在内存中,然后可以生成绝对代码。例如,如果你知道的话 用户进程将从位置R开始驻留,然后生成 编译器代码将从该位置开始并从那里向上扩展。如果,在 稍后,起始位置改变,那么就有必要了 重新编译此代码。 MS-DOS .COM格式的程序受到约束 编译时间。

  • 起始位置变化的原因是什么?是真的吗 因为上下文切换/交换?
  • 绝对代码是否意味着二进制代码?

加载时间。如果在编译时不知道进程将驻留的位置 在内存中,编译器必须生成可重定位代码。在这种情况下, 最终绑定被延迟到加载时间。如果起始地址发生变化,我们 只需重新加载用户代码即可合并此更改后的值。

  • 可重定位代码与绝对代码有何不同?它是否包含有关基数,限制和重定位寄存器的信息?
  • 如何重新加载再重新编译,因为他们提到重新加载意味着不重新编译只重新加载?

执行时间。如果流程可以在执行期间移动 一个内存段到另一个内存段,然后必须延迟绑定直到运行 时间。

  • 为什么在执行过程中可能需要移动一个进程?

    生成编译时和加载时地址绑定方法 相同的逻辑和物理地址。但是,执行时地址绑定方案会导致不同的逻辑和物理地址。

  • 编译和加载时方法如何生成相同的逻辑和物理地址?

2 个答案:

答案 0 :(得分:0)

动态库(.dll .so)是可重定位的,因为它们可能出现在不同应用程序的不同地址,但为了节省内存,操作系统在物理内存中只有一个副本(虚拟内存很棒),并且每个应用程序都具有只读访问权限。

对于可重定位的应用程序也是如此。为了安全起见,地址是随机的也是假的 - 一些远程攻击更加困难

答案 1 :(得分:0)

首先,我会找到更好的信息来源。你所拥有的是非常贫穷的。

  

起始位置变化的原因是什么?可以是因为上下文切换/交换吗?

您更改代码或需要将代码加载到内存中的其他位置。

  

绝对代码是否意味着二进制代码?

没有。它们是独立的概念。

  

可重定位代码与绝对代码有何不同?它是否包含有关基数,限制和重定位寄存器的信息?

可重定位代码使用相对地址,通常相对于程序计数器。

(基本限制和重定位寄存器将是系统特定的ocncept。)

  

如何重新加载然后重新编译,因为他们提到只重新加载意味着不重新编译只重新加载?

假设两个不同的程序使用相同的动态库。他们需要在内存中的不同位置加载。这不是效率问题。

  

为什么在执行过程中可能需要移动进程?

这是虚拟记忆之前的日子所做的。据我所知,没有人再这样做了。

  

编译和加载时方法如何生成相同的逻辑和物理地址?

我不知道他们在说什么& ^ 54。这句话毫无意义。