我最近正在学习有关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/

10-13 05:41