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

发布时间:2026/10/25 7:54:59

驱动模型匹配:从 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/10/24 8:40:15

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

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

2026/10/23 6:32:19

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

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

2026/10/25 7:53:15

PlotGround:科研图表多模态数字化与语义解析

1. 项目概述:当科研图像遇上多模态理解——PlotGround到底在解决什么问题?我在实验室带学生处理历史论文数据时,常遇到一个让人头皮发麻的场景:导师递来一张1987年《Nature》上发表的散点图胶片扫描件,说“把这组数据抽…

2026/10/25 7:53:15

无标签说话人嵌入为何必须适配vMF球面分布

1. 为什么“无标签说话人嵌入增强”这件事,十年来始终卡在vMF分布的临界点上你有没有遇到过这样的场景:语音助手把张三的声音误判成李四,会议转录系统在多人交替发言时突然“失忆”,安防系统对同一人的不同录音片段给出天差地别的…

2026/10/25 7:53:15

程序员转型AI:大模型时代90天速成指南

1. 程序员转型AI领域的时代机遇2023年被称为"AI大模型元年",全球科技巨头和初创企业纷纷布局大模型赛道。根据LinkedIn最新数据,AI相关岗位薪资普遍比传统IT岗位高出30%-50%,其中大模型研发岗的薪资溢价更是达到80%以上。这种人才供…

2026/10/25 7:53:15

本地AI服务可达性验证:解决CLI中model not found的真相

1. “Agent-Reach”不是新工具,而是CLI生态中一个被误读的信号灯最近在多个技术社区——尤其是Reddit的r/Python、r/MachineLearning和r/ComfyUI板块——频繁刷到“Agent-Reach”这个词。它既没出现在PyPI官方索引里,也不在GitHub Trending榜上&#xff…

2026/10/25 7:53:15

AI应用架构设计:从LLM、Agent到MCP的分层实践与避坑指南

1. 从一张架构图说起:为什么AI应用架构值得单独拎出来讲很多人第一次接触AI应用开发,脑子里想的都是"调个API就完事了"。我刚开始也是这么想的——拿个大模型接口,套个前端页面,能对话就算跑通了。直到真正接手一个要上…

2026/10/25 7:48:15

pstack-claude:构建Claude工作流栈的工程化实践

1. 从 pstack-claude 这个标题说起:它到底想解决什么问题第一次看到pstack-claude这个项目名,我的直觉是:这大概率是一个把 Claude 系列模型能力做“栈式封装”的工具或脚手架。pstack这个词本身带有“process stack”“prompt stack”或者“…

2026/10/25 0:02:22

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/25 0:02:23

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/25 0:02:23

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/25 0:02:22

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/25 0:02:23

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/25 0:02:23

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

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

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

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