如何解决运行时地址绑定在操作系统中是如何工作的?
共有三种地址绑定方案:
- 编译时地址绑定:符号地址在编译期间转换为实际内存地址,加载器只是将程序加载到内存地址中。
- 加载时地址绑定:- 在这种情况下,链接器将符号地址转换为可重定位地址,加载器使用重定位寄存器将可重定位地址重新定位为物理地址。
- 运行时地址绑定:- 我无法理解这部分。如果链接器创建了可重定位的地址。但是然后谁将进程加载到内存中。(我知道加载程序会这样做)但是如果加载程序加载进程,它就会成为加载时间地址绑定。我的主要问题是加载器从哪里获取在运行时应该在主内存中加载进程的地址。并且要使进程处于运行状态,程序的至少一个模块应该在主内存中。谁决定第一个模块将在哪个地址加载?
解决方法
你的术语有点不对:
-
静态 绑定在链接时为图像分配地址。令人困惑的 unix 调用链接加载;因此链接编辑器是 ld(加载程序)。如果没有未解析的引用,静态绑定可以由汇编程序完成,因此是 a.out 标准。
-
当一个图像被执行时,任何残留的未解析引用都可以被一个动态链接器解析。 动态链接器可以是一个简单的库,它查看可执行映像中未解析的符号,并将它们与映射到进程地址的一些共享对象相匹配空间。此时并非所有未解析的引用都需要解析;只有数据。由于过程是通过跳转到一个地址进入的,它们可以在进程调用过程时延迟被解析。实际上,该过程最初是由一个找到实际实现的人介入的,然后使它成为后续调用直接进入它的过程。如果您需要详细信息,请查找 GOT(全局偏移表)和 PLT(程序链接表)。很少有人愿意。
-
当一个进程绑定到一个共享对象时(通过 dlopen() 和 family),它会经历与(2)有些相似的操作,但通常不是通过符号接口,而是通过一个类-like 接口,其中动态附加的库有一个 init 函数,它提供了一个已知的布局数据结构来访问它。由此,可以轻松构建任何级别的复杂性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。