operating-system - 使用虚拟内存时重定位的目的是什么?
问题描述
我了解什么是重定位和虚拟内存。但是,如果首选地址是虚拟内存,我想不出为什么现代操作系统无法在其首选地址加载程序。能够将相同的虚拟内存映射到不同的物理地址的操作系统是否不需要重定位?
解决方案
第一个原因是共享对象。如果共享对象无法“从任何地方运行”,那么如果所需地址已在使用中,则将它们映射到给定进程可能会失败。
第二个原因是破坏程序执行的可预测性;通过每次运行时从随机选择的地址启动程序,针对该程序的恶意软件必须更加努力地进行可用的攻击。
第三个原因是它很容易,尤其是对于 ARM 和 amd64 架构。这些拱形避开“mov %rax, <64bit-address>”,转而支持“lea %rax, symbol(%rip)”或“mov %rax, symbol@GOTPCREL(%rip)”。在前一种情况下,地址是相对于程序计数器的;在前者中,包含地址的 GOT 是相对于程序计数器的。加载程序(在内核中,不是 ld 命令),因此只需要重写 GOT。
在 i386 架构中它更麻烦,因为它有一个弱 pc 相对模型。
推荐阅读
- html - CSS:如何顶部对齐旋转的文本?
- skype - 没有鼠标的 Skype 或 Zoom
- php - 使用 while 循环和 for 循环无法获得相同的结果
- r - R - 删除字符中长度为一的字符串和停用词(使用 tidytext)
- flutter - setState 不会在颤动中更新 GridView
- c++ - Intellij Rider:如何配置您的运行/调试配置以使用您的 dll 执行另一个应用程序 exe
- javascript - 如何在nodejs socket.io中创建一个cookie
- kotlin - Kotlin synchronized() 不锁定基本类型吗?
- angular - 当表格行的复选框值更改时检索对象
- python - 从 pycaret.classification 导入时出错 *