我最近正在学习有关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
一样大。
我有道理吗?有什么理由使这些代码安全吗?
答案 0 :(得分:1)
vmlinux.lds.S
可以:
. = KIMAGE_VADDR + TEXT_OFFSET;
之后
_text = .;
所以_text = KIMAGE_VADDR + TEXT_OFFSET
。然后减去TEXT_OFFSET
时,__PHYS_OFFSET
与KIMAGE_VADDR
相同。
因此,如果KIMAGE_VADDR
为非负数,则__PHYS_OFFSET
也是如此。