内核中通过/proc/kallsyms获得符号的地址--全局变量snd_write_bypass

本文介绍Linux内核符号表/proc/kallsyms的生成过程及其在调试中的应用。详细讲述了kallsyms如何从vmlinux生成,并在内核启动时形成/proc/kallsyms文件。此外还涉及了如何通过配置选项来包含所有内核符号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在内核中通过/proc/kallsyms获得符号的地址

 

Linux内核符号表/proc/kallsyms的形成过程
---------------------------------------------------------------------------

./scripts/kallsyms.c负责生成System.map
./kernel/kallsyms.c负责生成/proc/kallsyms

./scripts/kallsyms.c解析vmlinux(.tmp_vmlinux)生成kallsyms.S(.tmp_kallsyms.S),然后内核编译过程中将kallsyms.S(内核符号表)编入内核镜像uImage

内核启动后./kernel/kallsyms.c解析uImage形成/proc/kallsyms


/proc/kallsyms包含了内核中的函数符号(包括没有EXPORT_SYMBOL)、全局变量(用EXPORT_SYMBOL导出的全局变量)

 

 

为了更好地调试内核,引入了kallsyms。kallsyms抽取了内核用到的所有函数地址(全局的、静态的)和非栈数据变量地址,生成一个数据块,作为只读数据链接进kernel image,相当于内核中存了一个System.map。需要配置CONFIG_KALLSYMS

.config
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y 符号表中包括所有的变量(包括没有用EXPORT_SYMBOL导出的变量)
CONFIG_KALLSYMS_EXTRA_PASS=y


make menuconfig
General setup  --->  
    [*] Configure standard kernel features (for small systems)  --->
        [*]   Load all symbols for debugging/ksymoops
        [*]     Include all symbols in kallsyms
        [*]     Do an extra kallsyms pass  

 

注: 配置CONFIG_KALLSYMS_ALL之后,就不需要修改all_symbol静态变量为1了

 

/dav/test #  cat /proc/kallsyms | grep snd_write_bypass
805330a0 r __ksymtab_snd_write_bypass
8054504d r __kstrtab_snd_write_bypass
8086e068 B snd_write_bypass

 

int snd_write_bypass = 0;
EXPORT_SYMBOL_GPL(snd_write_bypass);

 

 

[ 1858.449705] hello.ko,Hello, World - this is the kernel speaking
[ 1858.468448] current hello module usecount=10
[ 1858.476576] snd_write_bypass a=0x8086e068 v=0/dav/test # 
/dav/test # 
/dav/test # cat /proc/kallsyms | grep snd_write_bypass
805330a0 r __ksymtab_snd_write_bypass
8054504d r __kstrtab_snd_write_bypass
8086e068 B snd_write_bypass

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空胆好小

您的鼓励已签收,我会继续快马加

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值