struct task_struct
{
…
struct list_head tasks;
…
struct list_head thread_group;
…
}
thread_group 会包含当前的task_struct
证明如下:
(struct task_struct *)(NSD:0xFFFFFF8009125890) = 0xFFFFFF8009125890 -> (
...
thread_group_= (
next = 0xFFFFFF8009125F30,
prev = 0xFFFFFF8009125F30),
next = prev : 说明只有一个thread
这个task_struct 地址是 0xFFFFFF8009125890
0xFFFFFF8009125F30 - 0xFFFFFF8009125890 = 0x6a0
(gdb) print /x (int)&((struct task_struct *)0)->thread_group
$1 = 0x6a0
0x6a0 就是 thread_group 在task_struct中的偏移
也就是说 thread_group->next 指向的就是 当前task_struct 的thread_group