gpt4 book ai didi

linux - 为什么 Aarch64 内核镜像的物理地址是非负的?

转载 作者:太空狗 更新时间:2023-10-29 12:23:07 25 4
gpt4 key购买 nike

最近在学习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

我说的有道理吗?有什么理由使这些代码安全吗?

最佳答案

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com