我已经了解了 Galvin 操作系统概念的内存管理概念,我已经阅读了一个声明:
如果您在编译时知道进程将驻留在内存中的哪个位置,则可以生成绝对代码。
在编译时处理器如何知道主内存进程中的哪个内存位置将存储。
有人可以解释一下,如果我们在编译时知道进程将驻留在内存中的哪个位置,那么它的确切含义是什么,因为当程序从准备就绪状态转移到运行状态时分配内存。
我已经了解了 Galvin 操作系统概念的内存管理概念,我已经阅读了一个声明:
如果您在编译时知道进程将驻留在内存中的哪个位置,则可以生成绝对代码。
在编译时处理器如何知道主内存进程中的哪个内存位置将存储。
有人可以解释一下,如果我们在编译时知道进程将驻留在内存中的哪个位置,那么它的确切含义是什么,因为当程序从准备就绪状态转移到运行状态时分配内存。
通常,机器代码不是与位置无关的。为了能够在任意起始地址加载它并在那里运行,需要一些关于机器代码的额外信息(例如,它在哪里拥有指向自身各个部分的地址),因此它可以调整到任意位置。
OTOH,如果代码总是要加载到相同的固定地址,那么您不需要任何额外的信息和处理。
absolute
他的意思是fixed
+ final
,已经调整到适当的地址。
处理器什么都不“知道”。你“告诉”它。
我不知道他对“绝对代码”的确切含义,取决于您使用的操作系统,带有代码和数据的程序将被加载到虚拟地址并从那里执行。
除此之外,不是编译器而是链接器设置程序将加载到的地址。
现代操作系统(如 Linux)正在使用地址空间布局随机化来避免在加载每个程序时使用一个静态地址,并避免利用软件缺陷的可能性。
如果您正在编写自己的操作系统,也许osdev.org wiki 对您来说可能是一个很好的资源。如果你会读/说德语,我也推荐lowlevel.eu。