【问题标题】:Why are programs not written using physical addresses?为什么不使用物理地址编写程序?
【发布时间】:2016-03-08 11:21:31
【问题描述】:

我正在准备我的操作系统课程的期末考试,我在教授的一张幻灯片上偶然发现了这个问题。我的猜测是,这真的很难做到,因此就你可以获得的生产量而言不是很实用 - 你必须以某种方式跟踪每个程序正在使用的物理内存的哪一部分,小心不要在映射到各种设备等的区域中写入。

这是对的还是我错过了什么?

【问题讨论】:

  • 很多原因。我将从安全方面给出一个:如果攻击者知道库的确切加载位置,他们就可以更容易地利用您的程序。这导致Address Space Layout Randomization

标签: memory operating-system paging


【解决方案1】:

我们拥有虚拟内存的最重要原因之一与可执行代码的工作方式有关。考虑最简单的例子a = 12345,这里是汇编的样子(出于明显的原因简化了,一切都是 int):

Memory Address:Content at address
00000000000004: 12345 (or binary: 11000000111001)
00000000000008: a (phisical location of a)
0000000000000C: copy from 00000000000004 to 00000000000008 instruction

重要的部分是copy from 00000000000004 to 00000000000008 instruction 这样做只是从一个位置从另一个位置复制一堆内存。

当您尝试执行此程序时,您必须在这些位置有a12345,否则它将无法运行。如果内存将直接是物理的,那么您的程序只有在它始终放置在相同的内存位置时才能工作。 这由virtual memory 解决,因此几乎所有内容都在同一个位置,将物理内存中的位置留给操作系统(使用paging)。否则,每当程序运行到物理位置时,您都必须更改代码中的所有指令,这只会使程序变得更大更慢。

虚拟内存解决了多个问题。首先,它允许多个程序在同一台机器上运行。其次,它允许操作系统通过randomizing the position of each page in the ram 提供额外的安全性。此外,理论上您可以分配比物理内存更多的内存,因为操作系统可以在程序需要时将内存从 RAM 移动到 HDD 并返回 (see this)。

【讨论】:

  • 感谢您在回答中提供的详细信息。因此,除了安全问题之外,使用物理地址编写程序会使它们不灵活,因为每次更改到另一个物理位置时,您都必须修改所有指令的地址(或指令本身?)以匹配那台新机器上有什么。对吗?
  • 是的,您必须在程序中引用地址的所有地方进行修改。引用可以在任何地方;在指令中(从 LocA 移动到 LocB,或跳转到 LocD 等)和数据中(想不出一个例子)。无论如何,这取决于编译器对代码汤做任何事情,你最终可能会在任何地方得到数十亿个地址引用。
  • 有一个系统,我不记得它的名字了地址空间。显然,这会对性能产生重大影响。
【解决方案2】:

使用逻辑地址转换的原因有很多。最重要的是,它通过分离每个进程使实现安全性变得更简单。

它还允许重新映射内存和内存共享。多个进程可以将同一个物理页映射到不同的逻辑地址。

它是虚拟内存的先决条件(一个不同的概念,但与逻辑内存转换有关)。

它允许所有进程(以及同一应用程序的东部实例)具有相同的内存布局。

它在很大程度上消除了内核为进程分配连续内存块(页框)的需要。可以从不连续的页框创建连续的逻辑地址空间。

【讨论】:

    猜你喜欢
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多