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

Memory 为什么程序不使用物理地址编写?,memory,operating-system,paging,Memory,Operating System,Paging,我正在准备操作系统课的期末考试,我在教授的一张幻灯片上偶然发现了这个问题。我的猜测是,这真的很难做到,因此就你可以获得的产量而言,这并不太实际-你必须以某种方式跟踪每个程序正在使用的物理内存的哪一部分,小心不要在映射到各种设备的区域中写入,等等 这大概是对的,还是我遗漏了什么?我们拥有虚拟内存的最重要原因之一在于可执行代码的工作方式。考虑到最简单的示例a=12345,下面是程序集的外观(由于明显的原因而简化,所有内容都是int): 重要的部分是从00000000000004复制到00000000

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


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

我们拥有虚拟内存的最重要原因之一在于可执行代码的工作方式。考虑到最简单的示例
a=12345
,下面是程序集的外观(由于明显的原因而简化,所有内容都是int):

重要的部分是
从00000000000004复制到00000000000008指令
这样做只是从一个位置从另一个位置复制一堆内存

当您尝试执行此程序时,必须在这些位置安装
a
12345
,否则将无法运行。如果内存是直接物理的,那么只有当它总是放在同一个内存位置时,程序才会工作。 这可以通过以下方法解决:使几乎所有内容都位于同一位置,将物理内存中的位置留给操作系统(使用)。否则,每当程序运行到物理位置时,就必须更改代码中的所有指令,这只会使程序变大、变慢


虚拟内存解决了多个问题。首先,它允许多个程序在同一台机器上运行。其次,它允许操作系统通过以下方式实现额外的安全性。此外,从理论上讲,您可以分配比物理内存更多的内存,因为操作系统可以在程序需要时将内存从RAM移到HDD再移回来()。

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

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

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

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


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

原因很多。我将从安全性方面给出一个例子:如果攻击者知道库的精确加载位置,他们就更容易利用您的程序进行攻击。这让我们感谢你回答中的细节。因此,除了安全问题之外,使用物理地址编写程序会使程序变得不灵活,因为每次更改到另一个物理位置时,都必须修改所有指令(或指令本身?)的地址,以匹配新机器上的地址。是吗?是的,您必须在程序中引用地址的所有位置进行修改。参考文献可以在任何地方;在指令中(从LocA移动到LocB,或跳到LocD等)和数据中(想不出一个例子)。无论如何这取决于编译器对代码汤做任何它想做的事情,最终你可能会在任何地方得到数十亿个地址引用。有一个系统,不幸的是,我不记得它的名字,是谁在没有虚拟内存的情况下,通过在运行时修改程序的所有物理地址并将其安装到地址空间。显然,这会对性能产生重大影响。
Memory Address:Content at address
00000000000004: 12345 (or binary: 11000000111001)
00000000000008: a (phisical location of a)
0000000000000C: copy from 00000000000004 to 00000000000008 instruction