assembly - 在arm64汇编中, "adrp x0, idmap_pg_dir;"指令是什么意思?

标签 assembly linux-kernel arm64

一个关于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 指令部分,它说:

Is the program label whose 4KB page address is to be calculated. Its offset from the page address of this instruction, in the range +/-4GB, is encoded as "immhi:immlo" times 4096.

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

关于assembly - 在arm64汇编中, "adrp x0, idmap_pg_dir;"指令是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64554716/

相关文章:

c++ - 在 FriendlyARM 板 mini2440 中编程 GPIO 的最佳方式是什么?

linux-kernel - Linux 内核模块在卸载期间挂起

arm - 在 gcc 版本 5.0.1 上启用对 aarch64 (armv8-a) 的 fpu 支持

assembly - Arm64: "HINT 0x1b"和 "HINT 0x1F"的含义是什么?

c - 哪种 MCU(Cortex-M) 适用于时间关键的 GPIO 应用?

assembly - ROL AX,8 是 NOP,对吧?

c++ - USB 射频接收器鼠标黑客攻击

windows - 如何索引 malloc 的缓冲区和输出

linux - 内核参数

c - 在 arm64 linux 中混合 64/32 位用户空间(使用 CONFIG_COMPAT)