news 2026/9/1 23:28:25

驱动模型匹配:从 driver_register 到bus->match/probe 的绑定路径

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
驱动模型匹配:从 driver_register 到bus->match/probe 的绑定路径

设备在/sys里看得见却不probecompatible对了仍不绑驱动:根因常在bus/device/driver 三件套的匹配与绑定,而不是probe函数体本身。本文沿driver_registerbus_add_driverdriver_attachbus->matchprobe走通一次绑定,便于对照 sysfs 与 DT 排障。

源码锚点

路径作用
include/linux/device/driver.hstruct device_driverdriver_register
include/linux/device/bus.hstruct bus_typematch/probe/remove
include/linux/device.hstruct devicedevice_register
drivers/base/driver.cdriver_register/driver_attach
drivers/base/bus.cbus_add_driver、匹配与遍历
drivers/base/dd.cdevice_attach/__device_attach/really_probe
include/linux/mod_devicetable.hof_device_id等匹配表

核心结构(头文件可见字段):

/* include/linux/device/bus.h */structbus_type{constchar*name;int(*match)(structdevice*dev,structdevice_driver*drv);int(*probe)(structdevice*dev);int(*remove)(structdevice*dev);/* … */};/* include/linux/device/driver.h */structdevice_driver{constchar*name;structbus_type*bus;structmodule*owner;conststructof_device_id*of_match_table;int(*probe)(structdevice*dev);int(*remove)(structdevice*dev);/* … */};

注册骨架:

/* 典型写法:把 driver 挂到对应 bus */staticstructdevice_drivermy_drv={.name="my-drv",.bus=&platform_bus_type,/* 或 pci_bus_type 等 */.owner=THIS_MODULE,.of_match_table=my_of_match,.probe=my_probe,.remove=my_remove,};driver_register(&my_drv);/* 内部 bus_add_driver → driver_attach */

调用链

驱动加载 / 内置 init → driver_register(drv) /* drivers/base/driver.c */ → bus_add_driver(drv) /* drivers/base/bus.c */ → driver_attach(drv) → 遍历 bus 上已有 device → driver_match_device() /* 调 bus->match */ → device_driver_attach / really_probe → drv->probe(dev) 或 bus->probe 设备侧后注册(热插拔 / 晚枚举) → device_register(dev) → bus_probe_device / device_initial_probe → 对已注册 driver 再跑 match → probe

Device Tree 场景(platform 常见):

of_platform_populate / 创建 platform_device → device 挂上 platform_bus → bus->match:of_driver_match_device(看 compatible) → 命中后进入 probe

重点知识

1. 匹配键在 bus,不在「文件名像不像」
bus->match决定能否绑:platform 看of_match_table/name,PCI 看 ID 表,USB 看 vid/pid。只改模块名、不改 match 表,永远不会probe

2.driver_registerdevice_register谁先谁后都要能绑
模型支持双向:先有设备后有驱动,或反过来。driver_attach/device_attach保证后注册的一方仍会遍历匹配。排障时两边都要查/sys/bus/<bus>/devicesdrivers

3.probe失败会留下「半绑定」观感
really_probeprobe返回非 0 会解绑并可能打 defer(-EPROBE_DEFER)。依赖时钟/regulator/GPIO 未就绪时应用 defer,而不是假装成功;反复 defer 要查依赖图与 DT 资源。

4. 观测与配置

ls/sys/bus/platform/devices/ls/sys/bus/platform/drivers/# 看是否已 bindls-l/sys/bus/platform/devices/<dev>/driver# DT compatiblecat/proc/device-tree/.../compatible# 若启用 proc DT# 强制 bind/unbind(调试)echo<device>|sudotee/sys/bus/platform/drivers/<drv>/binddmesg|grep-iE'probe|defer'

5. 设计意图与踩坑

  • 意图:用统一 kobject/sysfs 拓扑表达硬件,把「发现」与「驱动逻辑」解耦。
  • compatible字符串与of_match_table不一致(多一个厂商前缀就 miss)。
  • owner/module引用错误,probe后模块可被卸载。
  • :在probe里睡眠过久占着绑定路径,拖慢整条 bus 枚举。
  • :忽略-EPROBE_DEFER,当成永久失败反复改 DT。

Checklist

  • 能画出driver_registermatchreally_probedrv->probe的链
  • /sys/bus/<bus>/drivers/<name>存在,且目标 device 的driver软链正确
  • DTcompatible(或 PCI/USB ID)与 match 表逐字符一致
  • probe失败路径可重入;资源获取失败优先-EPROBE_DEFER
  • 模块ownerremove成对;卸载无 UAF
  • dmesg能对应到本次 bind/probe 日志,而非只看业务 printk
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 23:26:03

x64dbg脚本编程中文优化:提升逆向分析效率的实践指南

在逆向工程和漏洞分析领域&#xff0c;x64dbg 是一款功能强大的开源调试器&#xff0c;深受安全研究人员的喜爱。然而&#xff0c;其内置的脚本引擎虽然灵活&#xff0c;但使用门槛较高&#xff0c;尤其是对于习惯中文环境的开发者而言&#xff0c;英文的脚本命令和文档常常成为…

作者头像 李华
网站建设 2026/9/1 23:24:00

MKVToolNix跨平台安装与无损混流实战:从GUI到CLI批量处理

这次我们来看一个在视频处理领域几乎绕不开的工具&#xff1a;MKVToolNix。它不是新出的AI模型&#xff0c;也不是需要大显存的深度学习框架&#xff0c;而是一个功能强大、跨平台、完全免费开源的MKV&#xff08;Matroska&#xff09;多媒体容器处理工具套件。对于经常需要处理…

作者头像 李华
网站建设 2026/9/1 23:20:42

Java实现ECG信号处理:滤波、QRS检测与心率计算实践

简介&#xff1a;本资源是一套基于Java语言实现的ECG信号处理系统源码&#xff0c;面向医疗健康领域的软件开发者、生物医学工程学生及数字信号处理研究者&#xff0c;解决心电信号滤波去噪、特征提取与波形识别等核心问题&#xff0c;适用于远程监护系统开发、教学实验及算法验…

作者头像 李华
网站建设 2026/9/1 23:20:07

SeaTunnel (Zeta引擎)与SeaTunnel (Spark/Flink引擎)有啥区别,哪个性能更优

SeaTunnel (Zeta引擎)与SeaTunnel (Spark/Flink引擎)有啥区别&#xff0c;哪个性能更优SeaTunnel 是“数据集成框架”&#xff0c;Zeta/Flink/Spark 是它可以使用的不同“执行引擎”。 对你目前这种 MySQL CDC → MySQL、实时同步、多表同步 场景&#xff0c;我更推荐 SeaTunne…

作者头像 李华
网站建设 2026/9/1 23:19:10

信号特征提取实战:时域频域指标详解与故障诊断应用

简介&#xff1a;本资源是一份面向信号处理初学者与工程实践者的Python时域频域特征提取工具脚本&#xff0c;适用于机械故障诊断、生物电信号分析、振动监测等需量化信号特性的实际场景。资源聚焦核心特征计算逻辑&#xff0c;覆盖6类关键时域指标&#xff08;方差、标准差、峭…

作者头像 李华
网站建设 2026/9/1 23:17:55

基于SSM的高校宿舍管理系统设计与实现全流程解析

简介&#xff1a;本资源是一套面向计算机专业本科生的毕业设计与课程实践项目——基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架开发的高校宿舍管理系统&#xff0c;聚焦校园信息化管理痛点&#xff0c;解决宿舍分配、费用收缴、报修响应、访客登记等核心业务场景…

作者头像 李华