【发布时间】:2016-06-09 09:45:31
【问题描述】:
我正在尝试定位一个线程的task_struct 的地址。首先,我需要得到init_task的task_struct的地址,然后我遍历整个列表,最后得到一个特定线程的task_struct。 init_task中的task_struct可以通过命令从/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 的地址吗?
【问题讨论】:
-
你机器的架构是什么?有没有可能是IA64?另外,看看你的内核
.config中的CONFIG_ARCH_INIT_TASK是否设置为y。 -
不,我的机器是 x86_64。而且我当前版本的内核配置文件(4.5)没有
CONFIG_ARCH_INIT_TASK选项。我还检查了旧内核版本(3.12)的.config文件,其中导出了init_task符号,也没有这样的选项。看来问题不是因为.config文件-:(( -
您能否检查
.config中的下两个选项以获取新内核:CONFIG_UNUSED_SYMBOLS和TRIM_UNUSED_KSYMS?其中一些不太可能已启用,但如果是,则可能是原因。 -
是的,新内核有
CONFIG_UNUSED_SYMBOLS=y,但没有找到TRIM_UNUSED_KSYMS选项。据我了解,启用CONFIG_UNUSED_SYMBOLS选项将导出未使用的符号,这意味着如果不使用init_task,无论如何都会导出它。所以这似乎不是原因。还是我误会了? -
是的,你的理解是正确的。我只看到您缺少
init_task()符号的两个可能原因:1. 如果CONFIG_ARCH_INIT_TASK=y2.CONFIG_TRIM_UNUSED_KSYMS=y并且符号未在内核中使用。可能有另一种机制可以去除未使用的符号,但我不知道。
标签: linux-kernel symbols