【发布时间】:2020-04-10 09:08:48
【问题描述】:
我了解什么是重定位和虚拟内存。但是,如果首选地址是虚拟内存,我想不出为什么现代操作系统无法在其首选地址加载程序。能够将相同的虚拟内存映射到不同的物理地址的操作系统是否不需要重定位?
【问题讨论】:
标签: operating-system virtual-memory relocation
我了解什么是重定位和虚拟内存。但是,如果首选地址是虚拟内存,我想不出为什么现代操作系统无法在其首选地址加载程序。能够将相同的虚拟内存映射到不同的物理地址的操作系统是否不需要重定位?
【问题讨论】:
标签: operating-system virtual-memory relocation
第一个原因是共享对象。如果共享对象无法“从任何地方运行”,那么如果所需地址已在使用中,则将它们映射到给定进程可能会失败。
次要原因是破坏程序执行的可预测性;通过每次运行时从随机选择的地址启动程序,针对该程序的恶意软件必须更加努力地进行攻击。
第三个原因是它很容易,尤其是使用 ARM 和 amd64 架构。这些拱形避开“mov %rax, ”,转而支持“lea %rax, symbol(%rip)”或“mov %rax, symbol@GOTPCREL(%rip)”。在前一种情况下,地址是相对于程序计数器的;在前者中,包含地址的 GOT 是相对于程序计数器的。加载程序(在内核中,不是 ld 命令),因此只需要重写 GOT。
在 i386 架构中比较麻烦,因为它有一个弱 pc 相对模型。
【讨论】: