Day 8 上篇:深入理解 Linux 驱动模型中的平台驱动与总线驱动
B站相应的视屏教程:
📌 内核:博文+视频 - 总线驱动模型实战全解析 —— 以 PCA9450 PMIC 为例
敬请关注,记得标为原始粉丝。
在 Linux 内核驱动模型中,设备与驱动的组织方式不是随意堆砌,而是基于清晰的分类逻辑进行架构设计的。最核心的架构基础是“设备模型”(Device Model),而在此模型之上,各类驱动通过“平台驱动模型”与“总线驱动模型”协同运作,实现灵活、高度可扩展的硬件抽象层。
本篇将作为《Day 8》的上篇内容,系统性讲解平台驱动与总线驱动的理论框架、分类方式、匹配机制及其在设备树支持下的应用方法,帮助你全面理解驱动模型的本质与结构基础。
一、Linux 设备模型简介:统一的抽象基础
从 Linux v2.6 内核开始,引入了统一的“设备模型”(Device Model),核心目标是:以统一的方式管理设备与驱动的关系,实现热插拔、自动挂载、sysfs 信息导出、电源管理等功能。
设备模型的三个核心组成:
struct device:表示一个硬件设备;struct device_driver:表示该设备的驱动;struct bus_type:用于连接设备与驱动,形成“设备-驱动总线”。
设备模型本身并不决定设备的分类方式,而是提供统一接口,不同的子系统(如平台设备、I2C、SPI、PCI)根据硬件体系构建在它之上。
二、驱动模型的分类逻辑:平台与总线驱动
1. 平台驱动模型(Platform Driver Model)

平台驱动模型(Platform Driver Model)主要用于描述无法通过标准枚举机制自动发现的设备。如 SoC 内部的控制器、片上外设(LCD 控制器、PWM、I2C 控制器等)。
核心结构:
struct platform_devicestruct platform_driverplatform_bus_type
匹配机制:
- 驱动中注册
platform_driver - DTS 中节点生成
platform_device - 匹配通过
of_match_table或driver.name对比设备节点compatible或name属性
适用场景:
- 片上外设(SoC peripherals)
- 固定拓扑结构的设备(不支持热插拔)
2. 总线驱动模型(Bus Driver Model)

总线驱动模型 是针对可被标准总线发现和枚举的设备类型构建的驱动框架,如:
i2c_driver:用于挂在 I2C 总线上的设备spi_driver:用于 SPI 总线设备pci_driver:PCI/PCIe 设备usb_driver:USB 外设
这些总线本身都是 struct bus_type 的实例。每种总线都维护了一个自己的设备与驱动结构,提供标准化的 probe 入口与资源获取方式。
匹配机制:
- 子设备通过
of_device_id(或 ACPI)与i2c_driver中的匹配表比对 - 驱动通过总线核心进行绑定调用
probe
适用场景:
- 支持自动枚举或扫描的外部总线(可热插拔或可动态挂载设备)
- 芯片级外设(如 I2C、SPI 的从设备)
三、平台驱动与总线驱动的结构对比
| 特性 | 平台驱动(platform_driver) | 总线驱动(i2c_driver 等) |
|---|---|---|
| 设备定义方式 | platform_device | i2c_client 等设备结构 |
| 注册方式 | platform_driver_register() | i2c_add_driver() |
| 匹配依据 | compatible / name | compatible + 地址(reg) |
| 子系统入口 | platform_bus_type | i2c_bus_type 等 |
| 使用场景 | SoC 内部固定设备 | 可枚举的标准外设 |
| 资源获取方式 | platform_get_resource() | client->irq、regmap 等 |
| DTS 节点结构 | controller@base + 子节点 | controller + reg-based 子节点 |
四、设备模型下的总线分类汇总
Linux 中存在众多 bus_type 类型,每一种都对应一套设备与驱动注册框架。常见示例如下:
/sys/bus/
├── i2c ← 对应 i2c_driver
├── spi ← 对应 spi_driver
├── platform ← 对应 platform_driver
├── pci ← PCI 总线
├── usb ← USB 设备
├── mdio_bus ← PHY 设备
├── amba ← ARM SoC 特定外设
每个目录底下都包括:
/drivers/:驱动注册后的信息(.name)/devices/:设备创建后的路径(device node)
总线是连接设备与驱动的桥梁,它可能是虚拟的(如 platform 总线),也可能是物理的(如 i2c 总线)。平台总线更多是“逻辑建模”的结果,而总线驱动更多依托于硬件结构。
五、匹配机制与设备树支持对比
| 驱动模型类型 | 匹配字段 | DTS 中体现 | 设备注册方式 |
|---|---|---|---|
| platform | compatible/name | controller@base(顶层节点) | of_platform_populate() |
| i2c/spi/pci | compatible + reg | i2c1 → pmic@25 | i2c_new_device() / 自动扫描 |
| usb | USB ID / device | 通过 USB 描述符发现 | 热插拔自动创建 |
特别注意:虽然 platform_driver 是逻辑抽象,但有时它也用于创建“虚拟总线”,如 RPMsg/I2C 桥接场景中,虚拟 I2C 控制器仍通过 platform_driver 注册。
六、总结
我们可以这样更准确地描述 Linux 驱动的分类:
- 平台驱动模型:用于 SoC 中的控制器类设备(controller)
- 总线驱动模型:用于挂载在控制器之上的外设(device)
这不是“平台设备 vs 非平台设备”的二元划分,而是“控制器层 vs 外设层”的驱动模型设计逻辑。
✅ 下一篇预告
在《Day 8:下篇》中,我们将以 NXP i.MX8MP 的 I2C1 接口挂载 PCA9450 PMIC 为实例,系统讲解设备树的结构组织、设备与驱动的匹配机制、资源获取、probe 函数流程,并从驱动源码中深度解析总线驱动模型的实战逻辑。敬请期待!
相关文章:
Day 8 上篇:深入理解 Linux 驱动模型中的平台驱动与总线驱动
B站相应的视屏教程: 📌 内核:博文视频 - 总线驱动模型实战全解析 —— 以 PCA9450 PMIC 为例 敬请关注,记得标为原始粉丝。 在 Linux 内核驱动模型中,设备与驱动的组织方式不是随意堆砌,而是基于清晰的分类…...
freertos内存管理简要概述
概述 内存管理的重要性 在嵌入式系统中,内存资源通常是有限的。合理的内存管理可以确保系统高效、稳定地运行,避免因内存泄漏、碎片化等问题导致系统崩溃或性能下降。FreeRTOS 的内存管理机制有助于开发者灵活地分配和释放内存,提高内存利用…...
Dify问题记录 (一)
问题背景 Dify智能体将含有中文的JSON参数传递到Java后端时出现乱码。 解决办法 在HTTP节点前添加代码执行节点,将参数强制编码为UTF-8格式。在Java后端代码中进行解码操作,以确保参数的正确性。 代码如下: 代码执行节点中代码 function main({arg…...
全新突破 | 更全面 · 更安全 · 更灵活
xFile 高可用存储网关 2.0 重磅推出,新增多空间隔离功能从根源上防止数据冲突,保障各业务数据的安全性与独立性。同时支持 NFS、CIFS、FTP 等多种主流文件协议,无需繁琐的数据拷贝转换,即可与现有系统无缝对接,降低集成…...
使用Python建立双缝干涉模型
引言 双缝干涉实验是物理学中经典的实验之一,它展示了光的波动性以及量子力学的奇异性。实验结果表明,当光或粒子通过两条狭缝时,它们会产生干涉现象,形成明暗相间的条纹图案。这种现象不仅说明了光的波动性,还揭示了量子力学的核心思想——粒子具有波动性。今天,我们将…...
T-Box车载系统介绍及其应用
定义 T-Box汽车系统,全称为Telematics - BOX,也常简称为车载T - BOX,是汽车智能系统及车联网系统中的核心组成部分,是安装在车辆上的一种高科技远程信息处理器。 工作原理 T-Box的核心功能主要通过MPU和MCU实现。MPU负责应用程序功…...
SQLyog使用教程
准备工作 链接本地数据库 准备 1:安装mySQL数据库 2:安装SQLyong 连接本地数据库 打开SQLyong应用,将会出现下面的页面 点击新建,输入链接名 输入密码,点击 连接 按钮 如果出现连接错误,且错误号为2058…...
for循环的优化方式、循环的种类、使用及平替方案。
本篇文章主要围绕for循环,来讲解循环处理数据中常见的六种方式及其特点,性能。通过本篇文章你可以快速了解循环的概念,以及循环在实际使用过程中的调优方案。 作者:任聪聪 日期:2025年4月11日 一、循环的种类 1.1 默认有以下类型 原始 for 循环 for(i = 0;i<10;i++){…...
使用 Python 扫描 Windows 下的 Wi-Fi 网络实例演示
使用 Python 扫描 Windows 下的 Wi-Fi 网络 代码实现代码解析 1. 导入库2. 解码混合编码3. 扫描 Wi-Fi 网络4. 运行函数 这是我当前电脑的 wifi 连接界面。 这个是运行的效果图: 代码实现 我们使用了 Python 的 subprocess 模块来调用 Windows 的内置命令 netsh…...
python manimgl数学动画演示_微积分_线性代数原理_ubuntu安装问题[已解决]
1.背景 最近调研python opencv, cuda加速矩阵/向量运算, 对于矩阵的线性变换, 秩, 转秩, 行列式变化等概概念模糊不清. 大概课本依旧是天书, 于是上B站搜索线性代数, 看到 3Blue1Brown 线性变换本质 视频, 点击观看. 惊为天人 --> 豁然开朗 --> 突然顿悟 --> 开心不已…...
【vue3】@click函数传动态变量参数
根据java的学习,摸索了一下vue3 函数传参的方式。以此作为记录。有更好的其它方式,可以评论区补充。 <script> const tmpref(); </script><button click"tmpFunction(传递参数:tmp)">按钮</button> // 直接【字符串…...
用matplotlib生成一个炫酷的爱心
下面是结合数学方程和可视化技巧,生成一个炫酷的爱心效果: import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation # 创建画布 fig plt.figure(figsize(8, 8)) ax plt.axes(xlim(-2.5, 2.5), ylim(-3,…...
【leetcode hot 100 300】最长递增子序列
错误解法:在每次更新db[i]时,如果当前nums[i]>nums[i-1]就db[i-1]1,否则db[i-1] class Solution {public int lengthOfLIS(int[] nums) {int n nums.length;int[] db new int[n]; // db[i]表示到i的最长严格递增子序列的长度db[0] 1;f…...
oracle 12c密码长度,复杂度查看与设置
一 密码长度和复杂度 Oracle 数据库通过 PASSWORD_VERIFY_FUNCTION 来控制密码复杂度。 1.1 查看当前的密码复杂度设置 SELECT * FROM dba_profiles WHERE resource_name PASSWORD_VERIFY_FUNCTION; LIMIT表示分配给该 PROFILE 的密码验证函数名称。如果为 NULL,…...
数据结构——哈希技术及链地址法
目录 一、哈希的定义 二、哈希冲突定义 三、构造哈希函数的方法 四、四种解决哈希冲突的方法 4.1 开放地址法 4.2 链地址法 4.3 再散列函数法 4.4 公共区溢出法 五、链地址法结构体设计 六、基本操作的实现 6.1 哈希函数 6.2 初始化 6.3 插入值 6.4 删除值 6.5 查…...
开源CMS的模块化设计和API接口如何具体影响其扩展性?
优秀的CMS系统都有自己主打的特点,开源CMS凭借其灵活性和低成本优势占据了市场主流地位,而模块化设计与API接口正是其扩展性的两大基石。本文将深入探讨这两大技术特性是如何影响cms的扩展性的。 一、模块化设计:功能解耦与生态繁荣的引擎 …...
【Docker】快速部署 Certbot 并为 Nginx 服务器配置 SSL/TLS 证书
【Docker】快速部署 Certbot 并为 Nginx 服务器配置 SSL/TLS 证书 引言 Certbot 是一个免费的开源工具,用于自动化管理和获取 SSL/TLS 证书,主要用于与 Let’s Encrypt 证书颁发机构交互。 步骤 Nginx 挂载 certbot 文件夹。 docker run -d \--name…...
Redis下载稳定版本5.0.4
https://www.redis.net.cn/download/ Redis下载 Redis 版本号采用标准惯例:主版本号.副版本号.补丁级别,一个副版本号就标记为一个标准发行版本,例如 1.2,2.0,2.2,2.4,2.6,2.8,奇数的副版本号用来表示非标准版本,例如2.9.x发行版本是Redis 3.0标准版本的非标准发行版本…...
Google Chrome下载受限制的解决方案【方法指南】
在国内使用网络时,部分用户在尝试访问Google Chrome官网下载谷歌浏览器时,常常遇到网页无法打开或文件下载失败的情况。这种下载受限制的问题多由网络访问政策或DNS解析异常导致。为了正常获取Google Chrome的最新版安装程序,用户需要通过一些…...
Linux关于git上传大文件的解决方案:使用Git LFS
最近想要上传sdk到gitlab仓库上,但是使用git push的时候发现限制文件上传的大小限制到了100MB。 保持当前仓库的干净,要么重新拉取,要么git reset HEAD^ --hard这个命令来重新进行commit,直到撤回到代码上显示没有commit的地方为止…...
JAVA后端八股面试经验总结-前言篇
1️⃣个人暑期实习面试情况 暑期实习面试告一段段落了 陆陆续续大小厂有20+Java后端开发的面经 2️⃣为什么要写这个呢? ①首先,了解最重点的面试最爱问的题型有哪些? 我会整理出我面到过至少2次的题目和回答方式࿰…...
《计算机名人堂》专栏介绍:先驱之路
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 🌟引言:先驱之路一、出发点:讲述数字世界的缔…...
参照Spring Boot后端框架实现序列化工具类
本文参照Jackson实现序列化工具类,旨在于简化开发 JacksonUtil.class public class JacksonUtil {private JacksonUtil() {}/*** 单例*/private final static ObjectMapper OBJECT_MAPPER;static {OBJECT_MAPPER new ObjectMapper();}private static ObjectMappe…...
mysql 删除表等待
今天有个表加字段,语句是先删除,后重新建,表没有数据 ,但是删除一个表的时候,语句drop table 提示超时 show processlist 后,等待类型是 Waiting for table metadata lock 取消重试几次后仍然是如此…...
MCP工具的配置文件格式是怎么样的?MCP教程平台推荐
MCP(Model Context Protocol)配置文件是AI开发中连接MCP服务器的核心文件,采用JSON格式定义服务参数。它广泛应用于Cursor、ChatWise等AI开发工具,帮助开发者快速配置本地或远程MCP服务。本文将深入解析MCP配置文件的结构、获取方…...
网络安全法规与入门指南
在当今数字化时代,网络安全已成为保障个人隐私、企业利益和国家安全的关键领域。随着网络攻击的日益复杂和频繁,了解和遵守网络安全法规变得尤为重要。本文将深入探讨网络安全相关法规,并为想要进入这一领域的读者提供实用的入门指南。 一、…...
医院访客登记如何做才能更高效?
在医院工作过的朋友,大概都有过这样的体验:一到探视时间,门诊大厅、病房入口就开始拥堵,尤其是一些管控较严的科室,如ICU、手术区、儿科病房,来访人员必须逐一登记信息。人一多,就容易出错、漏登…...
学习笔记五——Rust 控制流全解析
📚 目录 什么是控制流?Rust 有什么特别?if 表达式完整语法loop / while / for 三种循环写法match 表达式 _ 通配符深入解释if let 表达式用法与场景Option、Some、None 全面通俗讲解 "Tom" 和 "Tom".to_string() 有啥本…...
我的Hexo自动Webhook部署方案
前言 最近我也是重新开始管理我的博客网站了,之前大概有了半年的时间没有写文章了。也是经过这半年的学习,我了解的知识更多,更广了。 当我开始写 Hexo 博客的时候,首先我得把 Markdown 文件内容拷贝到服务器上,然后写…...
智慧医院室内导航系统架构拆解:技术选型与性能攻坚指南
本文面向医院信息化团队技术负责人及医疗IoT解决方案开发者,聚焦解决大规模院区导航系统的扩展性、多源数据融合及实时路径规划等技术难点,提供从架构到落地的完整技术路线图。 如需获取智慧医院导航导诊系统解决方案请前往文章最下方获取,如…...
