Linux kernel 为什么Linux ARM64引导中的文本地址如此之高?
我目前正在学习ARM64体系结构,我很难理解Linux如何引导。从链接器脚本中,我们可以看到:Linux kernel 为什么Linux ARM64引导中的文本地址如此之高?,linux-kernel,boot,arm64,Linux Kernel,Boot,Arm64,我目前正在学习ARM64体系结构,我很难理解Linux如何引导。从链接器脚本中,我们可以看到: SECTIONS { . = PAGE_OFFSET + TEXT_OFFSET; .head.text : { _text = .; HEAD_TEXT } 初始的\u文本符号非常高,类似于0xfffffffc00008000。据我所知,这个地址是一个物理地址,但在基于8Gb RAM的电路板上,这似乎是不可能的。这怎么可能?我错过什么了
SECTIONS {
. = PAGE_OFFSET + TEXT_OFFSET;
.head.text : {
_text = .;
HEAD_TEXT
}
初始的\u文本
符号非常高,类似于0xfffffffc00008000
。据我所知,这个地址是一个物理地址,但在基于8Gb RAM的电路板上,这似乎是不可能的。这怎么可能?我错过什么了吗
编辑:声明:
- Caches, MMUs
The MMU must be off.
“我遗漏了什么吗?”-是的。它不是一个物理地址(即
PHYS_OFFSET
)。但是Linux请求在关闭MMU的情况下启动,或者可能不再是这种情况?当然,在关闭MMU的情况下运行的少量入口点代码不使用虚拟地址(直接)。这并不影响vmlinux是从最终的线性映射地址范围(在TTBR1中)链接运行的事实,因此问题的前提是无效的。好吧,你说整个内核都链接了高地址,但是早期启动代码是位置独立的,所以不必担心它的实际位置。我理解对了吗?这有点简单,但基本上是的。当您从正确的虚拟地址运行C代码时,只是从head.s的一端到另一端发生了很多事情(我甚至不能完全理解)。“我遗漏了什么吗?”-是的。它不是一个物理地址(即PHYS_OFFSET
)。但是Linux请求在关闭MMU的情况下启动,或者可能不再是这种情况?当然,在关闭MMU的情况下运行的少量入口点代码不使用虚拟地址(直接)。这并不影响vmlinux是从最终的线性映射地址范围(在TTBR1中)链接运行的事实,因此问题的前提是无效的。好吧,你说整个内核都链接了高地址,但是早期启动代码是位置独立的,所以不必担心它的实际位置。我理解对了吗?这有点简单,但基本上是的。当您从正确的虚拟地址运行C代码时,只是从head.s的一端到另一端发生了很多事情(我甚至不能完全理解这一点)。