在内核开发的过程中,我们会经常用到或者听别人提到kallsyms, 但是这个是什么东西,有什么作用呢,这里就来分析记录下。
一、何为kallsyms
kallsyms包含内核中所有导出的 符号表,名字大概的是 kernel all symbols。
在2.6版本内核中,为了更好地调试内核,引入了kallsyms信息。kallsyms抽取了内核用到的所有函数地址(全局的、静态的)和非栈数据变量地址,生成一个数据块,作为只读数据链接进kernel image,相当于内核中存了一个System.map.
二、如何才会有kallsyms
如果想要使用kallsyms,需要开启配置才行:
CONFIG_KALLSYMS=y
在操作系统中查看kallsyms命令:
[root@localhost boot]# cat /proc/kallsyms | head -10
0000000000000000 D per_cpu__irq_stack_union
0000000000000000 D __per_cpu_start
0000000000004000 D per_cpu__gdt_page
0000000000005000 d per_cpu__exception_stacks
000000000000b000 d per_cpu__idt_desc
000000000000b010 d per_cpu__xen_cr0_value
000000000000b018 D per_cpu__xen_vcpu
000000000000b020 D per_cpu__xen_vcpu_info
000000000000b060 d per_cpu__mc_buffer
000000000000c570 D per_cpu__xen_mc_irq_flags
当然也可以用另一种方式查看,其实就是说的System.map,在boot下面:
[root@localhost boot]# cat /boot/System.map-2.6.32-431.el6.x86_64 | head -10
0000000000000000 A VDSO32_PRELINK
0000000000000000 D __per_cpu_start
0000000000000000 D per_cpu__irq_stack_union
0000000000000000 A xen_irq_disable_direct_reloc
0000000000000000 A xen_save_fl_direct_reloc
0000000000000040 A VDSO32_vsyscall_eh_frame_size

本文详细解析了内核开发中kallsyms的概念,它是内核导出符号表,用于调试映射、hook调用和Oops时提供符号名称。文章介绍了kallsyms的启用方法、查看方式以及其在定位内核地址和符号、调试中的关键作用。


被折叠的 条评论
为什么被折叠?



