编译时间。如果您在编译时知道进程将驻留的位置 在内存中,然后可以生成绝对代码。例如,如果你知道的话 用户进程将从位置R开始驻留,然后生成 编译器代码将从该位置开始并从那里向上扩展。如果,在 稍后,起始位置改变,那么就有必要了 重新编译此代码。 MS-DOS .COM格式的程序受到约束 编译时间。
加载时间。如果在编译时不知道进程将驻留的位置 在内存中,编译器必须生成可重定位代码。在这种情况下, 最终绑定被延迟到加载时间。如果起始地址发生变化,我们 只需重新加载用户代码即可合并此更改后的值。
执行时间。如果流程可以在执行期间移动 一个内存段到另一个内存段,然后必须延迟绑定直到运行 时间。
为什么在执行过程中可能需要移动一个进程?
生成编译时和加载时地址绑定方法 相同的逻辑和物理地址。但是,执行时地址绑定方案会导致不同的逻辑和物理地址。
编译和加载时方法如何生成相同的逻辑和物理地址?
答案 0 :(得分:0)
动态库(.dll .so)是可重定位的,因为它们可能出现在不同应用程序的不同地址,但为了节省内存,操作系统在物理内存中只有一个副本(虚拟内存很棒),并且每个应用程序都具有只读访问权限。
对于可重定位的应用程序也是如此。为了安全起见,地址是随机的也是假的 - 一些远程攻击更加困难
答案 1 :(得分:0)
首先,我会找到更好的信息来源。你所拥有的是非常贫穷的。
起始位置变化的原因是什么?可以是因为上下文切换/交换吗?
您更改代码或需要将代码加载到内存中的其他位置。
绝对代码是否意味着二进制代码?
没有。它们是独立的概念。
可重定位代码与绝对代码有何不同?它是否包含有关基数,限制和重定位寄存器的信息?
可重定位代码使用相对地址,通常相对于程序计数器。
(基本限制和重定位寄存器将是系统特定的ocncept。)
如何重新加载然后重新编译,因为他们提到只重新加载意味着不重新编译只重新加载?
假设两个不同的程序使用相同的动态库。他们需要在内存中的不同位置加载。这不是效率问题。
为什么在执行过程中可能需要移动进程?
这是虚拟记忆之前的日子所做的。据我所知,没有人再这样做了。
编译和加载时方法如何生成相同的逻辑和物理地址?
我不知道他们在说什么& ^ 54。这句话毫无意义。