【问题标题】:Why physical address of Aarch64 kernel image is nonnegative?为什么 Aarch64 内核映像的物理地址是非负的?
【发布时间】: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


    【解决方案1】:

    vmlinux.lds.S 会:

    . = KIMAGE_VADDR + TEXT_OFFSET; 
    

    紧随其后

    _text = .;
    

    所以_text = KIMAGE_VADDR + TEXT_OFFSET。然后,当您减去 TEXT_OFFSET 时,__PHYS_OFFSET 将与 KIMAGE_VADDR 相同。

    因此,如果KIMAGE_VADDR 是非负数,那么__PHYS_OFFSET 也是。

    【讨论】:

    • 好吧,我认为KIMAGE_VADDR 必须是虚拟地址(正如它的名字所说),因为物理地址 0xFFFF000000000000 + 128M 是不现实的。真的是物理地址吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 2019-02-19
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多