我找到了一些关于什么是“地址绑定”的解释。他们说“地址绑定是将虚拟或逻辑地址映射到物理地址的操作”。
这个定义正确吗?
我无法确定它是否正确,因为大学演讲说将虚拟地址转换为物理地址是在执行时执行的。但是,地址绑定表示绑定操作可以在编译时、加载时或执行时实现。
这说明存在矛盾。
我找到了一些关于什么是“地址绑定”的解释。他们说“地址绑定是将虚拟或逻辑地址映射到物理地址的操作”。
这个定义正确吗?
我无法确定它是否正确,因为大学演讲说将虚拟地址转换为物理地址是在执行时执行的。但是,地址绑定表示绑定操作可以在编译时、加载时或执行时实现。
这说明存在矛盾。
Quora 上的解释在我看来相当混乱,并且混淆了许多概念。
术语“地址绑定”,在内存地址(例如与网络地址相反)的上下文中,来自Leon Presser 和 John R. White 1972 年关于链接器和加载器的论文(另请参见ACM 条目),其中定义了如下:
快速阅读可能会让人觉得这是从内存管理的角度讨论逻辑和物理地址,但事实并非如此。在论文中,物理地址是“信息”在内存中的地址,而逻辑地址是用于引用该信息的符号。因此,地址绑定现在通常称为符号(或指针)重定位,正如您所说,这可能发生在编译时(例如生成静态二进制文件时),加载时(当动态链接器解析符号时)共享库),或在执行时(当正在运行的程序手动解析符号时,例如使用
dlopen
)。那篇文章很混乱。它文章的第一部分似乎是准确的。虚拟地址由 CPU 内核使用,它们由 MMU 映射到物理地址,然后在进入 RAM 时使用。不过,我从未听说过这被称为“地址绑定”。“映射”会更常见,但这只是一个术语问题。
然后在第二段中间有这个说法,指的是上述过程:
那是胡说八道。
在程序代码不知道它所在的虚拟地址但需要以某种方式考虑到它可以放置在虚拟内存中的任何位置的情况下,需要可重定位或与位置无关的代码。这与物理地址无关,因为系统上运行的程序代码不知道这些。它看到的所有地址都是虚拟地址。
共享库和地址空间布局随机化是需要位置无关代码的两种常见情况。它确实需要编译器的支持,因为必须构建代码以使其不能包含任何绝对内存地址,而是使所有访问都相对于它自己的位置或相对于存储在寄存器中的某个基位置。
所有这些都发生在进程的虚拟地址空间视图中。它需要编译器支持,因为代码本身需要知道它。
MMU 的虚拟地址转换不需要进程的配合。相反,操作系统的工作是根据需要修复地址映射,例如,如果进程的一部分被调出以进行交换,并且需要访问。
还提到了分段,它的工作原理与文章解释的非常相似,除了至少在 x86 上,分段产生虚拟地址,因此虚拟到物理内存映射发生在它之后。
(以上所有内容均基于我对 x86 系统的了解。其他系统可能会有所不同。)