问题描述
有关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。
因此,编译器将“偏移量”“计算”为“标签”。因此,将使用当前指令的“偏移量”,而不是标签的绝对地址。