Operating system 在操作系统中如何在执行时进行地址绑定?

Operating system 在操作系统中如何在执行时进行地址绑定?,operating-system,Operating System,我正在读加尔文的操作系统书。在内存管理的地址绑定中,它说了大约3种类型的地址绑定。编译时间、加载时间、执行时间。关于执行时地址绑定:“物理地址是在执行时计算的。”但我的问题是,这些物理地址的计算是为了将进程加载到内存中的内存基址。要首先执行该进程,必须将其加载到内存中。为此,它需要一些物理内存地址。那么在执行时如何计算这些地址呢?我很困惑 有人能解释一下吗 感谢当它说实际的基址是在执行时生成的时,它意味着RAM中的地址(物理地址)是在执行时使用MMU从虚拟地址确定的。整个地址转换是动态完成的。要

我正在读加尔文的操作系统书。在内存管理的地址绑定中,它说了大约3种类型的地址绑定。编译时间、加载时间、执行时间。关于执行时地址绑定:“物理地址是在执行时计算的。”但我的问题是,这些物理地址的计算是为了将进程加载到内存中的内存基址。要首先执行该进程,必须将其加载到内存中。为此,它需要一些物理内存地址。那么在执行时如何计算这些地址呢?我很困惑

有人能解释一下吗


感谢

当它说实际的基址是在执行时生成的时,它意味着RAM中的地址(物理地址)是在执行时使用MMU从虚拟地址确定的。整个地址转换是动态完成的。要执行进程,必须知道起始虚拟地址。当进程要运行时,它的虚拟页表被加载到MMU中,然后MMU快速计算物理地址(在RAM中),执行继续,MMU从页表生成物理地址。考虑一下塔嫩鲍姆的现代操作系统。我觉得更好。

你的想法是正确的。加载时和运行时绑定之间的区别在于,在运行时,每次有内存查找时,它都会经过一个类似于基址寄存器的“重定位寄存器”,然后添加一个偏移量

在加载时绑定中,它做同样的事情,但是后续的查找不需要计算这个寄存器。地址是在第一次将其拉入内存时设置的。因此,如果基址发生变化,您需要重新加载整个过程以修复所有可重新定位的地址

在运行时的情况下,您可以在物理内存中移动进程,而不必担心重新加载它来修复映射,因为每次访问内存时,它都会映射它

加载时绑定会导致匹配的逻辑/物理地址,但运行时会导致不同的逻辑/物理地址


我希望这对你来说更清楚。我也刚刚开始学习内存管理:)

执行时地址绑定通常只适用于程序中的变量,是脚本最常见的绑定形式,脚本不会被编译。在这种情况下,程序在脚本中的指令处理过程中第一次遇到变量时,会请求程序中变量的内存空间。内存将分配给该变量,直到程序序列结束,或者除非脚本中的特定指令释放绑定到变量的内存地址