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

发布时间:2026/9/17 4:01:42

驱动模型匹配:从 driver_register 到bus->match/probe 的绑定路径 设备在/sys里看得见却不probe、compatible对了仍不绑驱动根因常在bus/device/driver 三件套的匹配与绑定而不是probe函数体本身。本文沿driver_register→bus_add_driver→driver_attach→bus-match→probe走通一次绑定便于对照 sysfs 与 DT 排障。源码锚点路径作用include/linux/device/driver.hstruct device_driver、driver_registerinclude/linux/device/bus.hstruct bus_typematch/probe/removeinclude/linux/device.hstruct device、device_registerdrivers/base/driver.cdriver_register/driver_attachdrivers/base/bus.cbus_add_driver、匹配与遍历drivers/base/dd.cdevice_attach/__device_attach/really_probeinclude/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{.namemy-drv,.busplatform_bus_type,/* 或 pci_bus_type 等 */.ownerTHIS_MODULE,.of_match_tablemy_of_match,.probemy_probe,.removemy_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 → probeDevice Tree 场景platform 常见of_platform_populate / 创建 platform_device → device 挂上 platform_bus → bus-matchof_driver_match_device看 compatible → 命中后进入 probe重点知识1. 匹配键在 bus不在「文件名像不像」bus-match决定能否绑platform 看of_match_table/namePCI 看 ID 表USB 看 vid/pid。只改模块名、不改 match 表永远不会probe。2.driver_register与device_register谁先谁后都要能绑模型支持双向先有设备后有驱动或反过来。driver_attach/device_attach保证后注册的一方仍会遍历匹配。排障时两边都要查/sys/bus/bus/devices与drivers。3.probe失败会留下「半绑定」观感really_probe里probe返回非 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调试echodevice|sudotee/sys/bus/platform/drivers/drv/binddmesg|grep-iEprobe|defer5. 设计意图与踩坑意图用统一 kobject/sysfs 拓扑表达硬件把「发现」与「驱动逻辑」解耦。坑compatible字符串与of_match_table不一致多一个厂商前缀就 miss。坑owner/module引用错误probe后模块可被卸载。坑在probe里睡眠过久占着绑定路径拖慢整条 bus 枚举。坑忽略-EPROBE_DEFER当成永久失败反复改 DT。Checklist能画出driver_register→match→really_probe→drv-probe的链/sys/bus/bus/drivers/name存在且目标 device 的driver软链正确DTcompatible或 PCI/USB ID与 match 表逐字符一致probe失败路径可重入资源获取失败优先-EPROBE_DEFER模块owner与remove成对卸载无 UAFdmesg能对应到本次 bind/probe 日志而非只看业务 printk
延伸阅读

更多相关文章

2026/9/12 14:34:01

C++项目实战:从环境搭建到开源推广的完整工程实践指南

1. 先想清楚:涨粉和写C代码,到底有什么关系?“彭于晏们我想涨1000粉(C语言)”这个标题,乍一看有点无厘头,但背后反映了一个非常真实的需求:很多C学习者或开发者,在掌握了…

2026/9/16 13:41:45

chrome-devtools-mcp:给AI编程助手装上真实浏览器的“眼睛”

如果你正在用 AI 编程助手改代码、写单测,却总觉得“调试前端时 AI 帮不上忙”,那问题大概率不在模型能力,而在信息入口。现在的 AI 编程工具基本能理解代码、生成 diff,但遇到“页面为什么白屏”“接口数据为什么没渲染”“这个按…

2026/9/17 3:59:00

2026年9月MacBook选购指南:M3/M3 Pro实测与VMware/ENSP适配方案

1. 为什么2026年9月这个时间点买MacBook,必须重新算一笔账?2026年9月不是普通的时间节点——它恰好卡在苹果芯片代际更迭的“静默期”与“爆发前夜”之间。我从2015年开始做Mac生态适配服务,经手过超过3700台Mac设备的选型、部署和故障排查&a…

2026/9/17 3:58:59

Linux 字体推荐与字体冲突排查:终端中文显示优化

Linux 桌面用久了,迟早会碰到一个绕不开的话题:字体。刚装好系统那会儿,浏览器和终端里的中文看着还行,等你真正开始每天十几个小时盯着屏幕写代码、看文档、读日志,眼睛就开始提意见了——字重太细发虚、中文和英文不…

2026/9/17 3:58:59

2026年CPU散热器选购指南:从热力学原理到高性价比实战

1. 这不是“买哪个散热器”的问题,而是“你到底在给谁散热”的问题2026年谈CPU散热器,很多人第一反应是翻评测、看跑分、比价格——这就像看病只盯着药价,却没搞清自己得的是感冒还是心梗。我做硬件选型咨询和装机服务整整13年,经…

2026/9/17 3:58:59

汽车电子Simulink国产替代:MIL/SIL/HIL链路迁移与验证流程

上一篇聊"汽车行业为什么离不开 Simulink"发出去之后,后台收到的问题比我想的多得多,其中被问得最密集的一条是:那到底能不能换?国产替代这事儿,在汽车行业到底有没有可能性?说实话,这…

2026/9/17 3:58:59

索尼CD900与V600对比:第一代40mm监听单元的声音哲学与保养

最近把手头几台老索尼监听又翻出来挨个对比了一遍,最常听的就是MDR-CD900和MDR-V600。这两台机器放在一起特别有意思,都是第一代40mm动圈单元体系下的产物,但声音走向几乎是两个方向:CD900是冲着CD录音棚去的,清透、收…

2026/9/17 3:53:59

2026降AI率工具深度实测:从10款中筛选出3款真正能用的

先交代一下背景。2026年这个时间节点,AI生成内容在信息流、自媒体、电商文案、论文润色这些场景里的渗透率已经高得吓人,随之而来的就是各大平台和检测系统对“机器味”的识别越来越精准。我自己手里管着几个偏内容输出的账号,日常大量依赖AI…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/17 0:03:13

WiFi密码安全测试:从原理到实战的字典暴力破解指南

1. 写在前面:我为什么要研究WiFi密码这件事先交代一下背景。我身边有不少朋友,家里的WiFi密码常年是"12345678"或者"88888888",问就是"好记"。直到有一次,隔壁邻居蹭网蹭到我家路由器后台都进不去&…

2026/9/17 0:03:13

redis-py服务控制与监控函数实战:从ping到slowlog的巡检指南

我用 redis-py 写了快五年的业务代码,坦白说,真正让我觉得这个客户端“像一个成熟工具箱”的,不是 get/set 那套基本操作,而是它那批专门做服务控制与状态监控的辅助函数。日常开发里,大家把redis.Redis(host..., deco…

2026/9/17 0:03:13

SpringBoot+Vue3实现中小企业设备管理系统开发实践

1. 项目概述与核心价值中小企业设备管理系统是制造业、服务业等领域的基础信息化工具。传统设备管理往往依赖Excel表格或纸质记录,存在数据孤岛、流程混乱、维护成本高等痛点。这套基于Java SpringBootVue3MyBatis的技术方案,通过前后端分离架构实现了设…

2026/9/16 22:55:57

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/16 22:56:09

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/16 22:56:16

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码