0

虚拟内存和逻辑内存有助于确保程序不会破坏彼此的数据。

程序重定位几乎可以确保多个程序不会相互破坏。重定位会修改目标程序,以便可以将其加载到新的备用地址。

虚拟内存、逻辑内存和程序重定位有什么关系?它们相似吗?如果它们相同/相似,那么我们为什么需要程序重定位?

4

2 回答 2

1

可重定位程序,或者说另一种与位置无关的代码,传统上用于两种情况:

  • 对于任何代码,没有虚拟内存(或太基本的虚拟内存,例如经典 MacOS)的系统
  • 对于动态库,即使在具有虚拟内存的系统上,如果其他代码已经在主机程序的地址空间中的该空间中,动态库可能会发现自己加载在不是其首选地址的地址上。

然而,今天,即使是具有虚拟内存的系统上的主要可执行程序也倾向于与位置无关(例如 Mac OS X 上的 PIE* 构建标志),因此它们可以在随机地址加载以防止漏洞,例如使用 ROP* 的那些*。

* 与位置无关的可执行文件
** 面向返回的编程

于 2015-07-22T15:18:27.357 回答
0

虚拟内存不会阻止程序干扰其他程序。这样做的是逻辑内存。不幸的是,这两个概念经常被混为“虚拟内存”。

搬迁有两种类型,不清楚您指的是哪一种。但是,它们是相连的。另一方面,这个概念与虚拟内存并没有真正的关系。

可重定位代码的第一个概念。这对于通常必须映射到不同地址的共享库至关重要。

可重定位代码使用偏移量而不是绝对地址。当程序产生如下指令序列时:

JMP SOMELABEL
. . . 
SOMELABEL:

计算机或汇编程序将其编码为

JUMP the-number-of-bytes-to-SOMELABEL

而不是

JUMP to-the-address-of-somelabel.

通过使用偏移,无论 JMP 指令位于何处,代码的工作方式都相同。

第二种类型的重定位使用第一种。过去搬迁主要用于图书馆。现在,一些操作系统会在内存的不同位置加载程序段。这是为了安全。它旨在保留依赖于在特定地址加载的应用程序的恶意破解。

这两个概念都可以在有或没有虚拟内存的情况下工作。

请注意,通常不会修改程序以重新定位它。我一般来说,因为一个可执行文件通常会有一些地址需要在运行时修复。

于 2015-07-22T17:54:16.137 回答