usb_deregister_device_driver()修改未生效:自定义打印不显示原因排查
问题描述
我修改了内核源码kernel-source/drivers/usb/core/driver.c中的usb_deregister_device_driver函数,代码如下:
void usb_deregister_device_driver(struct usb_device_driver *udriver) { pr_info("%s: deregistering device driver %s\n", usbcore_name, udriver->name); /* fsleep(5); */ pr_info(" LWB ===========================deregistering device driver============================= \n"); driver_unregister(&udriver->drvwrap.driver); /* fsleep(5); */ pr_info("%s: LWB deregistering device driver %s DONE\n", usbcore_name, udriver->name); } EXPORT_SYMBOL_GPL(usb_deregister_device_driver);
但运行后仅显示默认的deregistering device driver打印信息,我添加的所有自定义打印均未显示;我确认内核镜像已加载,且其他代码修改均已生效,唯独此部分无变化,请问为何我的自定义注销输出无法显示?
可能的原因及解决方法
- 函数未被实际调用:
部分USB设备驱动的注销流程可能并未走usb_deregister_device_driver,而是直接调用了driver_unregister或其他底层逻辑。可以在driver_unregister的入口处添加临时打印,验证你的USB驱动注销时是否真的进入了目标函数。 - 编译优化移除了打印代码:
内核编译若开启了高性能优化(如CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y),编译器可能会判定打印语句无副作用而将其优化删除。可以给打印语句添加__attribute__((used))标记,或者临时降低该文件的编译等级(在对应Makefile中添加CFLAGS_driver.o += -O0)。 - 日志级别过滤了输出:
pr_info对应KERN_INFO级别,若系统内核日志输出级别设置过高(仅显示KERN_WARNING及以上),这些信息会被过滤。可通过dmesg -n 7临时调整日志级别,或检查/proc/sys/kernel/printk的默认配置。 - 代码未正确编译进内核/模块:
若USB core模块是动态加载模式(CONFIG_USB=m),仅重新编译内核镜像不会生效,需单独编译模块并重新加载:rmmod usbcore && insmod usbcore.ko。可通过zcat /proc/config.gz | grep CONFIG_USB确认模块编译状态。 - 符号被覆盖或函数被内联:
若usb_deregister_device_driver被声明为static inline,或存在同名符号冲突,会导致修改不生效。可检查头文件中的函数定义,或通过nm vmlinux | grep usb_deregister_device_driver查看符号是否为修改后的版本。
内容的提问来源于stack exchange,提问作者Henry Leong
相关产品推荐
相关产品推荐

