【问题标题】:Confusions about address binding关于地址绑定的困惑
【发布时间】:2016-04-24 08:46:49
【问题描述】:

编译时间。如果您在编译时知道进程将驻留的位置 在内存中,然后可以生成绝对代码。例如,如果你知道 用户进程将从位置 R 开始驻留,然后生成 编译器代码将从该位置开始并从那里向上扩展。如果,在 稍后,起始位置发生变化,则需要 重新编译这段代码。 MS-DOS .COM 格式的程序绑定在 编译时间。

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

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

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

执行时间。如果进程可以在其执行期间从 一个内存段到另一个内存段,然后绑定必须延迟到运行 时间。 .

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

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

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

【问题讨论】:

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


    【解决方案1】:

    首先,我会为您找到更好的信息来源。你所拥有的很穷。

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

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

    绝对码是二进制码吗?

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

    可重定位代码与绝对代码有何不同?是否包含base、limit和relocation register的信息?

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

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

    重新加载比重新编译更有效,因为他们提到只重新加载意味着不重新编译只重新加载?

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

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

    这是在虚拟内存出现之前的日子里所做的。据我所知,没有人再这样做了。

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

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

    【讨论】:

    • 这是我大学推荐的教科书(操作系统概念SILBERSCHATZ,GALVIN,GAGNE。)你能推荐一本更好的书吗?
    • 这就解释了。 VAX/VMS 操作系统内部很便宜。
    【解决方案2】:

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

    可重定位的应用程序也是如此。为了安全起见,地址是随机的也是明智之举——一些远程攻击稍微难一些

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 2012-03-06
      • 2015-04-24
      • 2014-06-06
      • 1970-01-01
      • 2021-01-29
      • 2019-05-17
      相关资源
      最近更新 更多