为什么“/boot/System.map-*”和“/proc/kallsyms”中的地址不匹配?

为什么“/boot/System.map-*”和“/proc/kallsyms”中的地址不匹配?

考虑Ubuntu 20.10 (Groovy Gorilla) 上/boot/System.map-5.8.0-50-generic的输出:/proc/kallsyms

$ sudo cat /boot/System.map-5.8.0-50-generic | grep sys_call_table
ffffffff820002e0 D sys_call_table
ffffffff82001360 D ia32_sys_call_table
ffffffff82002120 D x32_sys_call_table
$ sudo cat /proc/kallsyms | grep sys_call_table
ffffffff978002e0 D sys_call_table
ffffffff97801360 D ia32_sys_call_table
ffffffff97802120 D x32_sys_call_table

AFAIK,这些文件应该包含内核符号的当前加载地址,那么为什么它们不匹配呢?

是因为只/proc/kallsyms受KASLR影响吗?如果是这样,如何验证 KASLR 是否启用?

答案1

对,这就是由KASLR引起。请注意,所有地址的偏移量相同。内核不知道,System.map所以它不会更新它。

我不知道有什么方法可以检测 KASLR 是否在运行时从用户空间启用,缺少比较/proc/kallsymsSystem.map,或者可能导致 x86 上的恐慌(内核在恐慌时转储其偏移量)。

相关内容