发布时间:2026/9/1 23:28:38
驱动模型匹配:从 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/1 23:28:38

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

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

2026/9/1 23:23:38

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

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

2026/9/1 23:38:40

面齿轮建模全流程:从Matlab齿面计算到TCA验证

简介:本资源面向机械设计、齿轮传动系统开发及CAD/CAE仿真领域的工程师与高校研究者,聚焦面齿轮这一特殊盘形齿轮的高精度参数化建模难题。针对传统CAD软件难以直接生成复杂齿廓曲线的痛点,提供MATLAB编程驱动Pro/E(Creo&#xff…

2026/9/1 23:38:40

基于YOLOv8的交通违法车窗抛物抓拍系统详解与实战

简介:本资源是一套基于YOLOv8实现的交通违法车窗抛物智能识别系统,面向计算机、人工智能、自动化等专业本科生及初学者,解决城市交通监管中动态抛物行为自动抓拍与取证的技术难点,适用于毕业设计、课程设计、大作业及项目原型验证…

2026/9/1 23:38:40

std::numeric_limits<float>:一段深夜调试的浮点数探险

上周在折腾一个数值计算的小项目&#xff0c;需要用到浮点数的极值判断。一开始想当然地用FLT_MAX和FLT_MIN&#xff0c;后来翻cppreference才发现C11之后有更规范的std::numeric_limits<float>。正好手头有台阿贝云的免费云服务器&#xff0c;想着干脆在这上面写个测试程…

2026/9/1 23:38:40

车载音响体验指南:从硬件调校到音质评估的完整方法论

这次我们来看一个汽车音响系统的体验项目&#xff0c;它聚焦于岚图追光S这款车型搭载的音响系统&#xff0c;并以经典歌曲《枉凝眉》的龚玥演唱版本作为测试素材。对于关注汽车智能化、座舱娱乐体验&#xff0c;特别是对车载音响音质有要求的用户来说&#xff0c;这是一个非常具…

2026/9/1 23:38:40

游戏开发进阶:活用矩阵与数组思维,构建清晰高效的游戏逻辑

你是不是也遇到过这种情况&#xff1a;想写个小游戏练练手&#xff0c;或者优化一下某个功能&#xff0c;结果一上来就被各种坐标变换、状态管理、碰撞检测绕得晕头转向&#xff1f;代码写着写着就变成了一团乱麻&#xff0c;维护起来比重新写一遍还痛苦。很多人会把问题归结为…

2026/9/1 23:33:38

Brave邮箱别名创建指南

Brave浏览器创建邮件别名的具体步骤 Brave浏览器提供了一项隐私保护功能&#xff0c;允许用户创建虚假地址&#xff08;即邮件别名&#xff09;用于注册服务。以下是具体操作步骤&#xff1a; 1. 登录Brave账户 打开Brave浏览器&#xff0c;点击右上角的个人资料图标。选择*…

2026/9/1 16:02:17

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出&#xff0c;第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器&#xff0c;出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台&#xff0c;直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/1 8:27:47

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流&#xff1a;为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历&#xff1a;明明传感器本身性能很好&#xff0c;信号输出却一塌糊涂——噪声大、漂移明显、重复性差&#xff0c;怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/1 7:04:43

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起&#xff0c;其实就是嵌入式开发里最常遇到的一类需求&#xff1a;用一块不算贵的 MCU&#xff0c;同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控&#xff0c;主频…

2026/9/1 0:00:42

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

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

2026/9/1 0:00:42

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

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

2026/9/1 0:00:42

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

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

2026/9/1 0:00:42

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

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

2026/9/1 0:00:42

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

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

2026/9/1 0:00:42

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

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