Warm tip: This article is reproduced from serverfault.com, please click

linux kernel-在arm64汇编中,“ adrp x0,idmap_pg_dir;”是什么?

(linux kernel - In arm64 assembly, what does "adrp x0, idmap_pg_dir;" instruction mean?)

发布于 2020-10-27 12:44:50

有关arm64汇编语言的问题。
例如,在linux 5.9.15源代码中,在arch / arm64 / kernel / vmlinux.lds.S(链接程序脚本)中,有一行idmap_pg_dir = .;所以idmap_pg_dir是一个地址。现在,在arch / arm64 / kernel / head.S中,有一行adrp x0, idmap_pg_dir这是否意味着

1) x0 = PC + idmap_pg_dir  or  
2) x0 = idmap_pg_dir  ?  

我以为这样做的时候adrp x0, addr1,通常addr1是PC相对地址偏移量,而x0变为PC + addr但是链接描述文件似乎idmap_pg_dir只是一个绝对地址。(不是吗?)所以我很困惑。请有人纠正我。

Questioner
Chan Kim
Viewed
0
Chan Kim 2020-11-30 22:48:12

在《 ARMv8体系结构参考手册》的“ ADRP指令”部分中,它说:

是要计算其4KB页面地址的程序标签。它与该指令的页地址的偏移量在+/- 4GB范围内,编码为“ immhi:immlo”乘以4096。

因此,编译器将“偏移量”“计算”为“标签”。因此,使用当前指令的“偏移量”代替标签的绝对地址。