【问题标题】:What is absolute code and why is it known at compile time?什么是绝对代码,为什么在编译时就知道它?
【发布时间】:2014-06-26 12:10:31
【问题描述】:
在学习操作系统概念期末考试时,我偶然发现了
Compile time: If memory location knows, **absolute code** can be generated;
must recompile code if starting location changes
示例给出的绝对代码是中断向量表。我想知道该语句究竟是什么意思,为什么在编译时知道中断向量表?
【问题讨论】:
标签:
compiler-construction
operating-system
compile-time
【解决方案1】:
这意味着在已知的固定内存地址加载的代码。由于该地址是固定的,因此可以将跳转编译为直接指向其目标内存地址,而无需使用相对跳转指令或在加载时修复任何内容。
【解决方案2】:
给出的答案是正确的,但还有另一种情况。在嵌入式系统中,当为 ROM 编译时,代码的最终地址通常是相对较早做出的决定。对于小芯片,设计人员决定将代码的许多部分放置在芯片的内存空间中的什么位置,并且通常还有内存映射的 I/O 位置。对于 ROM,ROM 的目标地址是已知的。
在这种情况下,仍然有两种可能性。一是编译器可以生成直接寻址这些位置的代码(以及 C++ 帮助中的新位置等功能)。另一个是编译器生成绝对寻址和可重定位代码的混合。在每种情况下,具有“定位器”功能的特殊链接器都会输出具有绝对寻址的最终代码。在每种情况下,最终地址都是绝对的,不需要运行时修正。