在Linux内核中,我想探测内核函数effective_prio()
。它定义为static
。当我在kallsyms
中搜索它的符号时,我找不到它。 kallsyms
是否具有内核函数的所有符号?如果没有,哪些符号不包括在内?
函数没有出现在/proc/kallsyms
中有两种可能性:
static
,并且编译器决定内联函数(使用或不使用inline
关键字)#define
从编译中删除函数,例如:
#ifdef CONFIG_OPT
void foo(void) {
}
#endif
据我所知,如果函数没有出现在/proc/kallsyms
中,则无法从模块调用或探测它。但是,/proc/kallsyms
包含内核的所有函数,而不仅仅是通过EXPORT_SYMBOL
/ EXPORT_SYMBOL_GPL
导出的函数。
CONFIG_KALLSYMS_ALL=y
也需要看到非静态变量,例如:
grep sysctl_sched_nr_migrate /proc/kallsyms
其定义为:
const_debug unsigned int sysctl_sched_nr_migrate = 32;
kallsyms仅列出EXPORT_SYMBOL和EXPORT_SYMBOL_GPL宏导出的符号。
这是为了安全起见。我们通常不希望模块能够访问例如内部或安全功能。这些只是违背了使内核模块尽可能安全的想法,但允许它们尽可能多地执行。