先反汇编
$ aarch64-linux-gnu-objdump -d -S vmlinux > vmlinux.txt
然后再分析5.0内核的相关指令
8068709 ffff000011c30040 <__create_page_tables>:
8068710 mov x28, lr
8068711 ffff000011c30040: aa1e03fc mov x28, x30
8068712 adrp x0, init_pg_dir
8068713 ffff000011c30044: f0003260 adrp x0, ffff00001227f000 <init_pg_dir>
8068714 adrp x1, init_pg_end
8068715 ffff000011c30048: 900032a1 adrp x1, ffff000012284000 <_end>
以如下指令为例:
ffff000011c30044: f0003260 adrp x0, ffff00001227f000 <init_pg_dir>
查看符号表
$ cat System.map | grep init_pg_dir
ffff00001227f000 B init_pg_dir
找到 C6.2.10章节 ADRP的解释
f0003260机器码,immlo 为 bit30:bit29, immhi 为 bit23~bit5
所以 immhi:immlow 为 0b'000000000011001001111
imm = SignExtend(immhi:immlo:Zeros(12), 64);则为 0b'000000000011001001111000000000000 == 0x'64f000
而ffff00001227f000 - ffff000011c30000 == 0x'64f000
两者一致