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

时间:2015-12-03 17:51:59

标签: memory operating-system paging

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

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

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:0)

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

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

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

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

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