要在/proc/kallsyms
中显示符号,对于模块符号,内核将在modules
内核变量为首的模块对象上循环,并遍历每个模块的符号表。但是对于“核心”内核内置符号,它使用了一堆内核变量,如以下函数所示:
static unsigned long kallsyms_sym_address(int idx)
{
if (!IS_ENABLED(CONFIG_KALLSYMS_BASE_RELATIVE))
return kallsyms_addresses[idx];
/* values are unsigned offsets if --absolute-percpu is not in effect */
if (!IS_ENABLED(CONFIG_KALLSYMS_ABSOLUTE_PERCPU))
return kallsyms_relative_base + (u32)kallsyms_offsets[idx];
/* ...otherwise,positive offsets are absolute values */
if (kallsyms_offsets[idx] >= 0)
return kallsyms_offsets[idx];
/* ...and negative offsets are relative to kallsyms_relative_base - 1 */
return kallsyms_relative_base - 1 - kallsyms_offsets[idx];
}
问题是:
- 在哪里定义kallsyms_addresses和kallsyms_offsets数组?我试图在内核源代码中使用grep,但是只找到引用,没有定义。
- 它们在哪里初始化?
- 这些变量和/boot/System.map.kernel_version文件之间是什么关系?我认为它们应该是一致的,但是我仍然没有找到初始化代码。