为什么不使用物理地址编写程序?

Why are programs not written using physical addresses?

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

这是对的还是我遗漏了什么?

我们拥有虚拟内存的最重要原因之一与可执行代码的工作方式有关。考虑最简单的例子 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 so that virtually everything is in the same place, leaving the placement in the physical memory to the operating system (using paging) 解决。否则,每当程序 运行 到达物理位置时,您都必须更改代码中的所有指令,这只会使程序变得更大、更慢。

虚拟内存解决了多个问题。首先,它允许多个程序在同一台机器上 运行。其次,它允许 OS 通过 randomizing the position of each page in the ram. Also you can theoretically allocate more memory than you physical memory because the OS can move memory from RAM to HDD and back whenever the program needs it (see this).

进行额外的安全保护。

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

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

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

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

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