Linux系统里如何查看编译进内核的驱动模块详情?

在Linux系统中,驱动程序可以静态编译进内核镜像(vmlinux)或作为动态模块(.ko文件)加载,静态编译的驱动随内核启动自动初始化,无需手动加载,查看这类驱动需要结合内核启动信息、配置文件、符号表及系统目录等多维度信息,以下详细介绍具体方法及操作步骤。

linux如何查看编译进内核的驱动

通过内核启动日志(dmesg)查看驱动初始化信息

Linux内核启动过程中会输出详细的驱动加载日志,包括驱动名称、版本、初始化状态及关联设备等信息,可通过dmesg命令结合grep过滤关键字快速定位。

操作步骤

  1. 执行dmesg查看所有内核启动日志,或通过管道结合grep过滤特定驱动关键字(如驱动名称、设备类型):
    dmesg | grep -i "driver"  # 查看所有驱动相关日志
    dmesg | grep -i "usb"     # 查看USB驱动相关日志
    dmesg | grep -i "storage" # 查看存储驱动相关日志
  2. 日志中关键信息解读:
    • 若驱动静态编译成功,日志通常会显示类似“driver_name: loaded successfully”或“driver_name: registered new interface driver”的提示;
    • 若驱动初始化失败,会提示错误原因(如“driver_name: probe failed -110”),需结合硬件状态排查。

示例:查看usb_storage驱动(静态编译)的初始化日志:

$ dmesg | grep -i "usb_storage"
[    1.234567] usbcore: registered new interface driver usb-storage
[    1.234568] usb-storage 1-1:1.0: USB Mass Storage device detected

日志显示usb-storage驱动已成功注册并检测到设备,证明该驱动静态编译进内核。

检查内核配置文件(.config)确认编译选项

内核配置文件(.config)记录了内核的编译选项,静态编译的驱动对应CONFIG_*选项值为y,动态模块为m,通过检查.config可明确驱动是否静态编译。

操作步骤

  1. 定位当前内核的配置文件,通常位于以下路径(根据发行版不同可能存在差异):

    • /boot/config-$(uname -r)(推荐,对应当前运行内核的配置)
    • /usr/src/linux-$(uname -r)/.config(内核源码目录中的配置)
    • 若未找到,可通过zcat /proc/config.gz获取(需开启CONFIG_PROC_KCORE
  2. 使用grep搜索与目标驱动相关的CONFIG_*选项,过滤值为y的项:

    uname -r  # 获取当前内核版本,如5.15.0-76-generic
    grep "CONFIG_USB.*=y" /boot/config-$(uname -r)  # 查看静态编译的USB驱动
    grep "CONFIG_SCSI.*=y" /boot/config-$(uname -r) # 查看静态编译的SCSI驱动

示例:检查usb_storage驱动是否静态编译:

linux如何查看编译进内核的驱动

$ grep "CONFIG_USB_STORAGE=" /boot/config-5.15.0-76-generic
CONFIG_USB_STORAGE=y  # 值为y,表示静态编译进内核

若值为m,则表示该驱动编译为模块,需通过modprobe加载。

分析内核符号表(/proc/kallsyms)验证驱动符号

静态编译的驱动代码会链接到内核镜像中,其函数、变量等符号会出现在内核符号表/proc/kallsyms中,通过搜索驱动相关符号可进一步确认驱动是否已编译进内核。

操作步骤

  1. 直接查看/proc/kallsyms或结合grep过滤驱动关键字(如驱动名称、核心函数名):

    grep "usb_storage" /proc/kallsyms  # 搜索usb_storage驱动符号
    grep "scsi_host" /proc/kallsyms     # 搜索SCSI主机驱动符号
  2. 符号表中关键信息:

    • 若驱动静态编译,会输出类似“ffffffffa0011234 T usb_storage_init”的行(T表示全局可访问函数);
    • 若驱动未编译或为模块,则无相关符号输出(模块符号位于/proc/modules)。

示例:验证usb_storage驱动的符号:

$ grep "usb_storage" /proc/kallsyms
ffffffffa0011234 T usb_storage_init       # 驱动初始化函数
ffffffffa0014568 t usb_storage_remove      # 驱动移除函数(小t表示局部符号)

存在相关符号表明驱动已静态编译进内核。

探索sysfs文件系统查看驱动注册状态

sysfs是Linux内核的虚拟文件系统,用于导出内核设备信息,在/sys/bus/*/drivers/目录下可查看各总线已注册的驱动,包括静态编译的驱动。

操作步骤

linux如何查看编译进内核的驱动

  1. 进入不同总线的驱动目录,查看已注册的驱动列表:

    ls /sys/bus/platform/drivers/  # 查看platform总线驱动
    ls /sys/bus/pci/drivers/       # 查看PCI总线驱动
    ls /sys/bus/usb/drivers/       # 查看USB总线驱动
  2. 结合设备信息关联驱动:通过/sys/class/下的设备目录,可查看设备绑定的驱动,查看USB存储设备的绑定驱动:

    ls /sys/class/scsi_host/       # 查看SCSI主机设备
    ls -l /sys/class/scsi_host/host0/device/driver  # 查看host0设备绑定的驱动

示例:确认usb_storage驱动在USB总线下的注册状态:

$ ls /sys/bus/usb/drivers/usb-storage
bind  detach  new_id  uevent  unbind  # 存在usb-storage目录,表示驱动已注册

若目录存在,说明驱动已静态编译并成功注册到对应总线。

使用辅助工具辅助验证

除上述方法外,还可借助内核工具进一步确认:

  1. nm工具:若内核源码可用,通过nm vmlinux | grep driver_name查看内核镜像中的驱动符号(需安装binutils工具包)。
  2. scripts/drm version:针对DRM(Direct Rendering Manager)驱动,可通过内核源码中的scripts/drm version脚本查看驱动版本信息。

常用命令对比及适用场景

方法 命令示例 适用场景 优点 局限性
内核启动日志 dmesg | grep "driver_name" 快速查看驱动初始化状态 直观、无需额外文件 日志量大需过滤
内核配置文件 grep "CONFIG_*=y" /boot/config-$(uname -r) 确认驱动编译选项 精准判断是否静态编译 需定位正确配置文件
内核符号表 grep "driver_name" /proc/kallsyms 验证驱动符号是否链接进内核 可深入分析驱动细节 需了解驱动函数名
sysfs文件系统 ls /sys/bus/*/drivers/ 查看驱动注册状态及总线关联 可关联具体设备 需熟悉总线类型

相关问答FAQs

问题1:静态编译进内核的驱动和动态加载的模块有什么区别?如何区分?
解答:静态编译的驱动代码直接集成到内核镜像(vmlinux)中,随内核启动自动加载,无需单独文件;动态模块是独立的.ko文件,需通过insmodmodprobe手动/按需加载,区分方法:

  1. 查看内核配置文件:静态驱动对应CONFIG_*=y,动态模块对应CONFIG_*=m
  2. 检查/proc/modules:动态模块会在此文件中列出,静态驱动不会;
  3. 符号表位置:静态驱动符号在/proc/kallsyms,动态模块符号在/proc/modules

问题2:为什么在/sys/bus/drivers/下看不到某个驱动,但系统确实使用了它?
解答:可能原因包括:

  1. 总线路径错误:不同总线的驱动存储在不同子目录(如platform总线驱动在/sys/bus/platform/drivers/,PCI总线在/sys/bus/pci/drivers/),需在对应目录下查找;
  2. 驱动未注册:若驱动初始化失败(如硬件不兼容、资源冲突),可能未成功注册到sysfs,可通过dmesg查看错误日志;
  3. 动态模块未加载:若驱动为模块且未手动加载,仅lsmod可见,但不会出现在/sys/bus/*/drivers/(除非已加载并注册),建议结合dmesglsmod综合排查。

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/15266.html

(0)
酷番叔酷番叔
上一篇 4小时前
下一篇 3小时前

相关推荐

  • Linux如何安全删除目录?

    核心命令与区别rm 命令功能:删除文件及非空目录(含子目录和文件),基本语法: rm -r 目录名-r(或 -R)表示递归删除目录内所有内容,强制删除(慎用): rm -rf 目录名 # -f 强制删除,不提示确认示例:删除 /home/user/docs 及其内容rm -r /home/user/docsrm……

    2025年7月15日
    2100
  • Linux查看用户有哪些可靠方法?

    查看 /etc/passwd 文件(最直接)命令:cat /etc/passwd说明:所有用户信息存储在 /etc/passwd 文件中,每行代表一个用户,输出格式:用户名:密码占位符(x):用户ID(UID):组ID(GID):描述信息:家目录:默认Shelljohn:x:1001:1001:John Doe……

    2025年7月23日
    1900
  • 现代浏览器必备编解码器与DRM支持?

    现代浏览器的核心要素包括必要的编解码器和DRM支持,编解码器确保流畅播放多种音视频格式,DRM则保障受保护内容的合法访问,二者共同构成完整多媒体体验的基础。

    2025年7月1日
    2600
  • 如何快速掌握核心操作步骤?

    在Linux系统中,yum(Yellowdog Updater Modified)是RHEL、CentOS等发行版的核心包管理工具,虽然yum本身不直接提供软件安装路径的查询功能,但可通过结合rpm命令实现精准定位,以下是详细操作指南:查看已安装的软件包 yum list installed作用:列出所有已安装……

    2025年7月13日
    2100
  • Linux编译文件如何快速上手?

    基础编译流程(以C语言为例)安装编译工具安装GCC编译器(适用于C/C++):sudo apt update && sudo apt install gcc # Debian/Ubuntusudo dnf install gcc-c++ # Fedora/CentOS单文件编译假设文件名为 he……

    2025年7月30日
    1000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信