【问题标题】:In arm64 assembly, what does "adrp x0, idmap_pg_dir;" instruction mean?在 arm64 汇编中,“adrp x0, idmap_pg_dir;”是什么意思?指令是什么意思?
【发布时间】: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 只是一个绝对地址。 (不是吗?)所以我很困惑。请有人纠正我。

【问题讨论】:

  • 它将成为 PC 相对地址,但链接器会计算偏移量,以便最终给出正确的结果,因此 x0 = idmap_pg_dir (假设它是页面对齐的)。如果你在head.o 上执行objdump -dr,你应该会看到重定位类型。
  • 你的意思是编译器/链接器生成与位置无关的代码(PIC),所以即使链接器脚本中的变量地址被转换为PC相对值并且最终结果是正确的?似乎是这样。 (你可以回答,我可以选择)。我明天会检查 objdump -dr 的东西。谢谢!

标签: assembly linux-kernel arm64


【解决方案1】:

在 ARMv8 架构参考手册中,在 ADRP 指令部分,它说,

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

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

【讨论】:

  • 实际上是x0 = pc + (idmap_pg_dir - .)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 2017-06-11
  • 2018-03-05
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多