kallsyms在进行源码调试时具有相当重要的作用。Linux内核在编译的过程中,将内核所有的符号(所有的内核函数以及已经装载的模块)及符号的地址以及符号的类型都保存在了/proc/kallsyms文件中。具体格式: 符号地址 , 符号类型, 符号名
c0100000 T startup_32
c0100000 A _text
c01000c6 t checkCPUtype
c0100147 t is
486c010014e t is
386c010019f t L
6c01001a1 t check_x
87c01001ca t setup_idt
c01001e7 t rp_sidt
c01001f4 t ignore_int
c0100228 T calibrate_delay
为了弄清楚内核具体是怎样查询的,我们首先必须知道这些信息在内核中是怎样存储的。内核为了存储这些信息,定义了如下变量:
extern const unsigned long kallsyms_num_syms
extern const u8 kallsyms_token_table[]
const u16 kallsyms_token_index[]
extern const unsigned long kallsyms_addresses[]
extern const unsigned long kallsyms_markers[]
其中kallsyms_num_syms统计了内核中所有符号的个数,
kallsysm_addresses数组记录了所有内术符号的地址(已经按顺序排列好)
kallsyms_makers数组是函数名组成的一个大串,而该串的具体格式为
<length><length byte data>
也就是说对于每个符号而言,都存储的是length+1个字节的内容,其中每一个字节代表了该符号的总长度,而后面length个字节代表了符号内容。
为了方便符号的查找,将常用的串存储kallsyms_token_table数组中,而kall_syms_token_index则代表了该串的索引,索引就是一些没有用到的ASCII码值。
190 .asciz "t.text.lock."
191 .asciz "text.lock."
192 .asciz "t.lock."
193 .asciz "lock."
210 .asciz "tex"
229 .asciz "t."
239 .asciz "loc"
249 .asciz "oc"
250 .asciz "te"
https://blog.csdn.net/shen332401890/article/details/17140967