2016-04-24 59 views
0

编译时间。如果在编译时知道进程将在内存中驻留 ,则可以生成绝对代码。例如,如果您知道用户进程将从位置R开始驻留的 ,则生成的 编译器代码将从该位置开始并从那里向上延伸。如果在 的某个较晚的时间,的起始位置发生变化,那么将需要 重新编译此代码。 MS-DOS .COM格式的程序在编译时绑定在 。关于地址绑定的困惑

  • 什么可以是起始位置改变的原因?由于上下文切换/交换,它可以是 吗?
  • 绝对代码是指二进制代码吗?

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

  • 可重定位代码与绝对代码有什么不同?它是否包含有关基地,限制和重新安置登记的信息?
  • 如何重新加载更有效然后重新编译,因为他们提到只有重新加载意味着没有重新编译只重新加载?

执行时间。如果可以在执行过程中将移动到从 一个内存段到另一个内存段,则绑定必须延迟到运行 时间。 。

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

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

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

回答

0

首先,我会找到一个更好的信息来源。你有什么是非常可怜的。

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

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

绝对码是指二进制码吗?

不是。它们是独立的概念。

可重定位代码与绝对代码有什么不同?它是否包含有关基地,限制和重新安置登记的信息?

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

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

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

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

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

这是在虚拟内存之前的日子里完成的。据我所知,没有人再做这件事。

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

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

+0

这是我大学推荐的教科书(OS概念SILBERSCHATZ,GALVIN,GAGNE)。你能推荐一本更好的书吗? – user5951764

+0

这解释了它。 VAX/VMS操作系统内部成本低廉。 – user3344003

0

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

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