WSL2中/proc/kallsyms无printk却有_printk的原因及解决问询
WSL2内核模块开发中printk符号缺失问题排查与疑问
环境详情
- WSL2版本:最新预发布版(已执行
wsl --update --pre-release) - 测试发行版:WSL2下的Ubuntu、Arch Linux
- 当前运行内核:
6.6.87.2-microsoft-standard-WSL2(来自uname -r) - 可用内核模块目录:执行
ls /lib/modules输出:
5.15.153.1-microsoft-standard-WSL2 6.6.87.1-microsoft-standard-WSL2 6.6.87.2-microsoft-standard-WSL2 6.8.0-85-generic 5.15.167.4-microsoft-standard-WSL2 6.6.87.2-g427645e3db3a-dirty 6.6.87.2-microsoft-standard-WSL2+
其中包含标准Ubuntu内核6.8.0-85-generic的模块,但无法引导进入该内核,WSL2始终加载微软定制内核。
问题:/proc/kallsyms中缺失printk符号
查看内核符号表/proc/kallsyms时,未找到标准printk函数,仅能看到printk_timed_ratelimit等相关辅助函数;但在当前内核的模块符号文件Module.symvers中存在_printk符号,却无printk。
执行cat /proc/kallsyms | grep "T printk"的输出:
0000000000000000 T printk_timed_ratelimit 0000000000000000 T printk_percpu_data_ready 0000000000000000 T printk_parse_prefix 0000000000000000 T printk_trigger_flush 0000000000000000 T printk_sysctl_init 0000000000000000 T printk_all_partitions
查看当前内核模块符号(cat /lib/modules/$(uname -r)+/build/Module.symvers | grep "printk")的输出:
0x56470118 __warn_printk vmlinux EXPORT_SYMBOL 0x2592fc6c console_printk vmlinux EXPORT_SYMBOL_GPL 0xee8c02e9 vprintk_emit vmlinux EXPORT_SYMBOL 0xf2fb61bd vprintk_default vmlinux EXPORT_SYMBOL_GPL 0x122c3a7e _printk vmlinux EXPORT_SYMBOL 0x6128b5fc __printk_ratelimit vmlinux EXPORT_SYMBOL 0x07cc4a5d printk_timed_ratelimit vmlinux EXPORT_SYMBOL 0x371e1953 __printk_cpu_sync_wait vmlinux EXPORT_SYMBOL 0xa64c7249 __printk_cpu_sync_try_get vmlinux EXPORT_SYMBOL 0xc0fe9137 __printk_cpu_sync_put vmlinux EXPORT_SYMBOL 0x715a5ed0 vprintk vmlinux EXPORT_SYMBOL 0xa2e1b3ef trace_printk_init_buffers vmlinux EXPORT_SYMBOL_GPL 0x3cd1b510 trace_vbprintk vmlinux EXPORT_SYMBOL_GPL 0x2fa8463c trace_array_printk vmlinux EXPORT_SYMBOL_GPL 0x1ee083a3 trace_array_init_printk vmlinux EXPORT_SYMBOL_GPL 0xc3708747 trace_vprintk vmlinux EXPORT_SYMBOL_GPL 0xa20d01ba __trace_bprintk vmlinux EXPORT_SYMBOL_GPL 0x31019477 __ftrace_vbprintk vmlinux EXPORT_SYMBOL_GPL 0x133969d7 __trace_printk vmlinux EXPORT_SYMBOL_GPL 0x7e3bdecd __ftrace_vprintk vmlinux EXPORT_SYMBOL_GPL 0xd8df08ac acpi_handle_printk vmlinux EXPORT_SYMBOL 0x40812fa2 drm_dev_printk vmlinux EXPORT_SYMBOL 0xeb717212 dev_vprintk_emit vmlinux EXPORT_SYMBOL 0xf0ca01cd dev_printk_emit vmlinux EXPORT_SYMBOL 0x88d3028f _dev_printk vmlinux EXPORT_SYMBOL 0x3311b831 sdev_prefix_printk vmlinux EXPORT_SYMBOL 0x6abc4da1 scmd_printk vmlinux EXPORT_SYMBOL 0x3230c2b1 netdev_printk vmlinux EXPORT_SYMBOL 0x3ece0a5b seq_buf_do_printk vmlinux EXPORT_SYMBOL_GPL 0xbc5671dc v4l_printk_ioctl drivers/media/v4l2-core/videodev EXPORT_SYMBOL 0xeffa09b2 ibdev_printk drivers/infiniband/core/ib_core EXPORT_SYMBOL
另外,查看6.8.0-85-generic内核的Module.symvers时,同样无printk但存在_printk:
0xd0f284b8 mmiotrace_printk vmlinux EXPORT_SYMBOL 0x56470118 __warn_printk vmlinux EXPORT_SYMBOL 0x2592fc6c console_printk vmlinux EXPORT_SYMBOL_GPL 0xee8c02e9 vprintk_emit vmlinux EXPORT_SYMBOL 0xf2fb61bd vprintk_default vmlinux EXPORT_SYMBOL_GPL 0x122c3a7e _printk vmlinux EXPORT_SYMBOL 0x6128b5fc __printk_ratelimit vmlinux EXPORT_SYMBOL 0x07cc4a5d printk_timed_ratelimit vmlinux EXPORT_SYMBOL 0x371e1953 __printk_cpu_sync_wait vmlinux EXPORT_SYMBOL 0xa64c7249 __printk_cpu_sync_try_get vmlinux EXPORT_SYMBOL 0xc0fe9137 __printk_cpu_sync_put vmlinux EXPORT_SYMBOL 0x715a5ed0 vprintk vmlinux EXPORT_SYMBOL 0xa2e1b3ef trace_printk_init_buffers vmlinux EXPORT_SYMBOL_GPL 0x3cd1b510 trace_vbprintk vmlinux EXPORT_SYMBOL_GPL 0x920b2622 trace_array_printk vmlinux EXPORT_SYMBOL_GPL 0x078afbc0 trace_array_init_printk vmlinux EXPORT_SYMBOL_GPL 0xc3708747 trace_vprintk vmlinux EXPORT_SYMBOL_GPL 0xa20d01ba __trace_bprintk vmlinux EXPORT_SYMBOL_GPL 0x31019477 __ftrace_vbprintk vmlinux EXPORT_SYMBOL_GPL 0x133969d7 __trace_printk vmlinux EXPORT_SYMBOL_GPL 0x7e3bdecd __ftrace_vprintk vmlinux EXPORT_SYMBOL_GPL 0x17a6587c _RNvXs9x_NtCs7HWDDni9asp_8bindings12bindings_rawNtB6_15dev_printk_infoNtNtCsish51TdtVMS_4core7default7Default7default vmlinux EXPORT_SYMBOL_GPL 0xee5c4d70 _RNvNtCsdyVPidz6NUH_6kernel5print11call_printk vmlinux EXPORT_SYMBOL_GPL 0x672cbb2c _RNvNtCsdyVPidz6NUH_6kernel5print16call_printk_cont vmlinux EXPORT_SYMBOL_GPL 0xd8df08ac acpi_handle_printk vmlinux EXPORT_SYMBOL 0xdfe60478 dev_vprintk_emit vmlinux EXPORT_SYMBOL 0x0f7eae61 dev_printk_emit vmlinux EXPORT_SYMBOL 0x7ed41778 _dev_printk vmlinux EXPORT_SYMBOL 0x7ec52cf4 sdev_prefix_printk vmlinux EXPORT_SYMBOL 0x22e60a8e scmd_printk vmlinux EXPORT_SYMBOL 0xff3925f0 drm_dev_printk vmlinux EXPORT_SYMBOL 0x194736e5 netdev_printk vmlinux EXPORT_SYMBOL 0x3ece0a5b seq_buf_do_printk vmlinux EXPORT_SYMBOL_GPL 0x6a0c3847 __mlog_printk fs/ocfs2/cluster/ocfs2_nodemanager EXPORT_SYMBOL_GPL 0xb881b1a9 ath6kl_printk drivers/net/wireless/ath/ath6kl/ath6kl_core EXPORT_SYMBOL 0x2081266f ath_printk drivers/net/wireless/ath/ath EXPORT_SYMBOL 0xbc5671dc v4l_printk_ioctl drivers/media/v4l2-core/videodev EXPORT_SYMBOL 0x9deccbd5 ibdev_printk drivers/infiniband/core/ib_core EXPORT_SYMBOL
已尝试操作
- 更新WSL:执行
wsl --update --pre-release获取最新版本,内核仍为微软定制版 - 手动指定内核头文件路径:编译模块时需手动指定
/lib/modules/6.8.0-85-generic/build,默认路径文件不完整 - 尝试切换内核:无法引导进入
6.8.0-85-generic,WSL2始终加载微软定制内核 - 检查其他内核:
6.8.0-85-generic同样无printk符号,怀疑是现代Linux内核的普遍变更(如printk被内联或重命名为_printk)
疑问
- 为何
/proc/kallsyms中缺失printk但模块符号中存在_printk?这是WSL2定制特性还是现代内核的普遍行为? - 如何在WSL2中切换至
6.8.0-85-generic这类标准内核?微软定制内核是否因虚拟化需求做了精简? - 若此为预期行为,WSL2下内核模块开发中正确使用
printk的方式是什么?能否直接引用_printk?
内容的提问来源于stack exchange,提问作者Tayler
相关产品推荐
相关产品推荐

