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