「/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/kallsymsKASLRだけに影響を受けるからですか?それでは、KASLRが有効になっていることをどのように確認できますか?

答え1

うん、そうです。KASLRによる。すべてのアドレスのオフセットは同じです。カーネルはこれを知らないのでSystem.map更新しません。

/proc/kallsymsKASLRが実行時にユーザー空間で有効になっているか、比較合計が欠落してSystem.mapいるか、x86でパニックを引き起こす可能性があるか(パニックが発生した場合にカーネルがオフセットをダンプする)ことを検出する方法はありません。

関連情報