首页 > 解决方案 > 使用虚拟内存时重定位的目的是什么?

问题描述

我了解什么是重定位和虚拟内存。但是,如果首选地址是虚拟内存,我想不出为什么现代操作系统无法在其首选地址加载程序。能够将相同的虚拟内存映射到不同的物理地址的操作系统是否不需要重定位?

标签: operating-systemvirtual-memoryrelocation

解决方案


第一个原因是共享对象。如果共享对象无法“从任何地方运行”,那么如果所需地址已在使用中,则将它们映射到给定进程可能会失败。

第二个原因是破坏程序执行的可预测性;通过每次运行时从随机选择的地址启动程序,针对该程序的恶意软件必须更加努力地进行可用的攻击。

第三个原因是它很容易,尤其是对于 ARM 和 amd64 架构。这些拱形避开“mov %rax, <64bit-address>”,转而支持“lea %rax, symbol(%rip)”或“mov %rax, symbol@GOTPCREL(%rip)”。在前一种情况下,地址是相对于程序计数器的;在前者中,包含地址的 GOT 是相对于程序计数器的。加载程序(在内核中,不是 ld 命令),因此只需要重写 GOT。

在 i386 架构中它更麻烦,因为它有一个弱 pc 相对模型。


推荐阅读