Почему разница между указателем task_struct и полем внутри этой структуры настолько велика? - PullRequest
0 голосов
/ 20 марта 2020

Это утверждение:

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 ()?

1 Ответ

2 голосов
/ 20 марта 2020

С https://www.kernel.org/doc/Documentation/printk-formats.txt:

Pointers printed without a specifier extension (i.e unadorned %p) are
hashed to give a unique identifier without leaking kernel addresses to user
space. On 64 bit machines the first 32 bits are zeroed. If you _really_
want the address see %px below.
...