在arm64汇编中,“ adrp x0,idmap_pg_dir;”是什么?指示是什么意思?

问题描述

有关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只是一个绝对地址。 (不是吗?)所以我很困惑。请有人纠正我。

解决方法

在ARMv8体系结构参考手册的ADRP指令部分中,

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

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