Это утверждение:
pr_err("init=%p head=%p offset=%zd\n",
&init_task, &init_task.thread_group,
offsetof(struct task_struct, thread_group));
производит этот вывод при компиляции в модуль ядра и insmod'ed:
init=00000000b0561be0 head=00000000cab9146b offset=2416
Мой вопрос заключается в том, почему два адреса так далеко друг от друга, когда они должны быть только 2416 байт друг от друга? При печати смещений символов в GDB я также получаю ожидаемые значения, и я не уверен, где еще искать:
(gdb) p &init_task
$1 = (struct task_struct *) 0xffffffff82613780 <init_task>
(gdb) p &init_task.thread_group
$2 = (struct list_head *) 0xffffffff826140f0 <init_task+2416>
РЕДАКТИРОВАТЬ:% zx вместо% p выдает правильные числа. Так что, я полагаю, нет поддержки% p в printk ()?