我正在尝试查找线程的task_struct
地址。首先,我需要获取task_struct
的init_task
地址,然后迭代整个列表,最后获得特定线程的task_struct
。 task_struct
的init_task
可以通过命令
/proc/kallsyms
轻松获得。grep "\<init_task\>" /proc/kallsyms
。
当我使用旧的内核版本(3.12)时,此方法起作用。但是当我切换到新版本(4.5)时,这个想法在一开始就失败了。因为符号init_task
从/proc/kallsyms
中消失了。但是,当我检查源代码时,可以看到符号init_task
已导出(http://lxr.free-electrons.com/source/init/init_task.c?v=4.5#L18)。为什么它没有显示在/proc/kallsyms
中?还是有其他方法可以从用户空间程序获取init_task
的地址?
尝试使用CONFIG_KALLSYMS_ALL
选项集进行编译。没有它,kallsyms
似乎仅包含.text
和init.text
部分中的符号:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/scripts/link-vmlinux.sh#n152,https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/scripts/kallsyms.c#n250