一个地址 对应这一个函数,也就是函数指针位置,后面的是函数名
而内核的符号链表,也是同样的含义
内核进程中,有个进程 klogd,kernel log deamon 进程,监视内核进程,
其作用就是,解析 符号(函数名)和地址之间的关系。
oops,是系统出现问题了,比如内核崩溃,kernel panic了,会打印出当时的状态
包括CPU的EIP,各个寄存器的值
堆栈的内容,还有就是 backstrace,回溯函数调用的过程
这个回溯的过程,内部就是用到了内核符号表,将对应的函数的地址,翻译成对应的函数名,然后一个一个显示出来,否则我们看到的就只是一堆地址,这就是内核符号表的作用了。
也因此,说oops是和符号表是有关系的。
实际上,klogd使用到了两种类型的地址:
1.静态翻译,也就是使用system.map文件
2.动态翻译,使用到了动态可加载模块。
简单解释就是:
如果你是在一个可加载模块中出现了oops,这时候klogd就会去尝试翻译解析,但是却发现system.map中没有这个地址,所以就断定是可加载模块中有对应的地址,然后就会去向kernel要,原先模块导出到内核符号表中的那些符号,即使模块作者没有导出这些符号,那么klogd最终也会知道到底是哪个模块产生了这个oops,这比对于oops什么都不知道,要强很多。