为什么Aarch64内核映像的物理地址为非负数?

时间:2018-08-09 09:37:48

标签: linux linux-kernel kernel arm64

我最近正在学习有关Linux内核的引导系统。 (v4.6,带有ARM64架构。)

在源代码[floatLabel]="'always'"中,<div class="example-container"> <mat-form-field [floatLabel]="'always'"> <input matInput placeholder="Simple placeholder" required> </mat-form-field> </div> 的定义为:

arch/arm64/kernel/head.S

其中__PHYS_OFFSET仅定义为#define __PHYS_OFFSET (KERNEL_START - TEXT_OFFSET)部分。

如果我是对的,KERNEL_START是在内核编译期间确定的随机数,如/ arch / arm64 / Makefile所说:

_text

以使内核映像文件具有随机位置,因为链接描述文件TEXT_OFFSET包括:

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节将被随机放置。

head.S的其余部分将TEXT_OFFSET映射到_text以启用MMU。

我的问题是:KIMAGE_VADDR总是非负数吗?

我不知道__PHYS_OFFSET的确切物理位置在哪里,但是我认为__PHYS_OFFSET = _text - TEXT_OFFSET可能和_text一样大。

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

1 个答案:

答案 0 :(得分:1)

vmlinux.lds.S可以:

. = KIMAGE_VADDR + TEXT_OFFSET; 

之后

_text = .;

所以_text = KIMAGE_VADDR + TEXT_OFFSET。然后减去TEXT_OFFSET时,__PHYS_OFFSETKIMAGE_VADDR相同。

因此,如果KIMAGE_VADDR为非负数,则__PHYS_OFFSET也是如此。