Linux源码 kallsysm
阅读数:212 评论数:0
跳转到新版页面分类
Linux
正文
一、概述
在 Linux 中,/proc/kallsyms
文件包含了内核的符号表,这是一个列出内核中所有符号及其地址的列表。符号通常是函数名(例如系统调用或内核服务)或变量名。这个文件经常被用于调试目的或者确定某个函数或变量在内核内存中的位置。
例如,如果你想找出 printk
函数的内存地址,你可以这样做:
cat /proc/kallsyms | grep " printk"
使用 /proc/kallsyms
的一些注意事项:
-
权限:由于这个文件可能泄露敏感信息,通常只有 root 用户或具有相应权限的用户才能访问它。
-
符号类型:在
/proc/kallsyms
输出中,每个符号旁边都有一个字符表示符号的类型。例如,"t" 或 "T" 表示该符号在文本(代码)段,"d" 或 "D" 表示该符号在数据段,等等。 -
地址空间:列出的地址是内核地址空间中的位置,不应与用户空间程序中的地址混淆。
-
安全性:在某些系统中,为了安全考虑,可能会隐藏符号地址或限制
/proc/kallsyms
的读取。 -
实时性:这个文件提供了内核符号的实时视图,这意味着你可以在内核模块加载或卸载时看到符号表的变化。
-
调试信息:对于开发者和系统管理员来说,
/proc/kallsyms
是一个宝贵的资源,可以帮助他们理解内核的行为,尤其是在系统崩溃或出现其他问题时。 -
kallsyms_lookup_name:在内核模块中,可以使用
kallsyms_lookup_name
函数来动态地查找符号的地址,但这需要对内核编程有深入的了解。
二、相关代码
为了弄清楚内核具体是怎样查询的,我们首先必须知道这些信息在内核中是怎样存储的。内核为了存储这些信息,定义了如下变量:
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"