- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
最近在学习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/
我是一名优秀的程序员,十分优秀!