我最近正在学习有关Linux内核引导系统的信息。 (v4.6,带有ARM64 arch)。
在源代码arch/arm64/kernel/head.S
中,__PHYS_OFFSET
的定义为:#define __PHYS_OFFSET (KERNEL_START - TEXT_OFFSET)
其中KERNEL_START
仅定义为_text
部分。
如果我是对的,TEXT_OFFSET
是内核编译期间确定的随机数,如/arch/arm64/Makefile所说:TEXT_OFFSET := $(shell awk 'BEGIN {srand(); printf "0x%03x000\n", int(512 * rand())}')
因此,链接程序脚本/arch/arm64/kernel/vmlinux.lds.S
包括:内核镜像文件具有随机位置。
. = KIMAGE_VADDR + TEXT_OFFSET;
.head.text : {
_text = .;
HEAD_TEXT
}
在这里,
KIMAGE_VADDR
是虚拟地址0xFFFF000000000000 + 128M
。由于添加了TEXT_OFFSET
,因此_text
节将随机放置。head.S的其余部分将
KIMAGE_VADDR
映射到__PHYS_OFFSET
以启用MMU。我的问题是:
__PHYS_OFFSET = _text - TEXT_OFFSET
总是非负数吗?我不知道
_text
的确切物理位置在哪里,但是我认为512 * rand()
可能和512 * 32767 ~ 10MB
一样大。我有道理吗?是否有任何理由使这些代码安全?
最佳答案
vmlinux.lds.S
可以:
. = KIMAGE_VADDR + TEXT_OFFSET;
其次是
_text = .;
所以
_text = KIMAGE_VADDR + TEXT_OFFSET
。然后减去TEXT_OFFSET
时,__PHYS_OFFSET
将与KIMAGE_VADDR
相同。因此,如果
KIMAGE_VADDR
为非负数,则__PHYS_OFFSET
也是如此。关于linux - 为什么Aarch64内核镜像的物理地址为非负数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51763634/