【发布时间】:2018-08-09 09:37:47
【问题描述】:
我最近在学习Linux内核的引导系统。 (v4.6,带有 ARM64 架构。)
在源代码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 一样大。
我说得有道理吗?有什么理由让这些代码安全吗?
【问题讨论】:
标签: linux linux-kernel kernel arm64