kallsyms是否具有内核函数的所有符号?

在Linux内核中。

我想探索名为“effective_prio”的内核函数,它定义为“static int effective_prio(struct task_struct * p)”。 当我在kallsyms中search它的符号时,我无法find它。kallsyms是否具有内核函数的所有符号?如果没有,哪个不包含?

/proc/kallsyms没有出现两种可能性:

  1. 如果该函数被标记为static ,并且编译器决定内联该函数(带或不带inline关键字)
  2. 如果配置选项或其他#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宏导出的符号。

这是为了安全。 我们通常不希望模块能够访问例如内部或安全功能。 这些只是反对使内核模块尽可能安全的想法,但允许他们尽可能地做到这一点。