有关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。
因此,编译器将“偏移量”“计算”为“标签”。因此,使用当前指令的“偏移量”代替标签的绝对地址。
实际上,它是
x0 = pc + (idmap_pg_dir - .)
。