从静态绑定驱动模型到现代设备模型 —— 一次驱动架构的进化之旅

🔍

B站相应的视屏教程
📌 内核:博文+视频 - 从静态绑定驱动模型到现代设备模型


在 Linux 内核的发展历程中,设备驱动结构经历了从"硬编码 + 手动注册"的早期实现方式,到"设备模型统一管理"的现代化架构。这一演进不仅改变了驱动开发者的习惯,也极大提升了内核的可维护性、扩展性与模块化能力。

本篇博文将聚焦早期的 静态绑定驱动模型(Static Binding Driver Model),深入讲解其原理、结构、优缺点,并与后续的设备模型机制进行对比,帮助读者建立完整的认知脉络。


📘 第一部分:什么是静态绑定驱动模型?

所谓“静态绑定”,是指驱动代码中通过硬编码的方式指定所使用的设备资源(如物理地址、中断号、引脚编号等),并在模块初始化过程中手动完成所有注册与初始化步骤。

这种方式广泛存在于 Linux v2.4 及更早版本 中,当时还没有统一的 struct deviceplatform_driverof_match_table 等机制。


✅ 核心特征

特征类别表现
资源管理资源地址、IRQ 手动硬编码
匹配机制没有匹配机制,全靠人工指定
驱动结构所有逻辑集中在 init 函数中
生命周期管理没有 probe/remove 接口
模块加载无法自动匹配,仅靠 insmod
用户态接口无 sysfs 映射,udev 不可见

📌 示例:静态绑定驱动代码片段

#define LCDIF3_BASE  0x32fc6000
#define LCDIF3_IRQ   42static void __iomem *lcd_base;static int __init lcd_driver_init(void)
{request_mem_region(LCDIF3_BASE, 0x1000, "lcdif");lcd_base = ioremap(LCDIF3_BASE, 0x1000);request_irq(LCDIF3_IRQ, lcd_irq_handler, 0, "lcdif", NULL);// 初始化寄存器writel(0x01, lcd_base + 0x00);printk("lcd driver loaded\n");return 0;
}static void __exit lcd_driver_exit(void)
{free_irq(LCDIF3_IRQ, NULL);iounmap(lcd_base);release_mem_region(LCDIF3_BASE, 0x1000);
}module_init(lcd_driver_init);
module_exit(lcd_driver_exit);
MODULE_LICENSE("GPL");

📘 第二部分:静态绑定模型的优缺点

✅ 优点

  • 实现简单,易于快速验证硬件逻辑
  • 没有抽象层,调试路径清晰
  • 适用于早期定制板、实验性代码

❌ 缺点

问题类型描述
可移植性差所有硬件信息写死在代码中,不易适配新平台
不支持热插拔无法根据硬件动态加载驱动模块,udev 无法使用
维护困难所有初始化、清理逻辑集中在一个文件中,不易分离模块
无法复用没有设备模型的抽象结构,代码难以共享给其他项目或平台
无法使用设备树与现代 SoC 的 DTS 描述方式不兼容,不能通过 compatible 匹配驱动

📘 第三部分:设备模型的引入与演进

Linux 内核从 v2.5.x 开始引入设备模型(Device Model),在 v2.6.0(2003 年) 正式启用。

它提供了统一的结构用于描述设备(struct device)、驱动(struct device_driver)、总线(struct bus_type)与设备类(struct class),实现驱动与设备的解耦、匹配与动态管理


📎 核心机制

结构体作用说明
struct device表示一个设备本体,包含资源、状态等
struct driver表示驱动代码与功能结构
struct bus_type表示设备与驱动的匹配方式(如 platform)
struct class用于创建 /sys/class/ 接口

✅ 匹配机制演进

// 匹配表(由驱动提供)
static const struct of_device_id xxx_of_match[] = {{ .compatible = "fsl,imx8mp-lcdif1" },{}
};// 驱动注册结构
static struct platform_driver xxx_driver = {.probe = xxx_probe,.remove = xxx_remove,.driver = {.name = "lcdif",.of_match_table = xxx_of_match,},
};

📘 自动加载与用户空间联动

  • sysfs 自动创建 /sys/devices/platform/...
  • /sys/bus/platform/drivers/... 中挂接驱动
  • udev 可根据 alias 自动调用 modprobe 加载模块
    在这里插入图片描述

📘 第四部分:对比分析:静态绑定 vs 设备模型

对比维度静态绑定驱动设备模型驱动
资源定义硬编码通过 DTS 或 platform_device 动态提供
匹配机制无自动匹配支持 of_match_table 自动绑定
生命周期管理通过 module_init/exit 手动完成通过 probe/remove 自动分离处理
可移植性不具备平台适配能力支持同一驱动在多个硬件平台间共享
sysfs 支持不支持自动创建设备节点,支持 udev、热插拔等
资源释放手动 free_irq/iounmap支持 devm_* 系列自动回收
推荐使用场景早期内核、快速验证、简单定制板主线驱动开发、模块化平台支持

📘 第五部分:案例对比分析

📌 静态绑定代码核心点

  • 所有地址/中断号写死
  • 所有初始化逻辑集中在 lcd_driver_init()
  • 无匹配逻辑、无设备结构体、无 struct platform_device

📌 设备模型版本(platform)核心点

  • of_match_table 用于与设备树 compatible 匹配
  • 注册为 platform_driver,挂接 bus_type
  • probe() 自动被调用,完成注册与初始化
  • 所有资源通过 devm_* 自动管理

✅ 总结:为什么设备模型是驱动发展的必然?

静态绑定驱动模型虽然在早期发挥了重要作用,但随着 SoC 架构的复杂化与模块化需求的增强,其硬编码、不可复用的特性逐渐成为负担。

设备模型通过总线、设备、驱动三者的分离与抽象,成功实现了驱动框架的现代化,使得:

  • 一个驱动可以匹配多个设备
  • 一个设备可以热插拔与自动加载驱动
  • 系统可以动态管理设备生命周期
  • 用户空间可以通过 sysfs 观察设备状态

这正是现代嵌入式系统与通用 Linux 平台所需的基础能力。


📚 延伸阅读

  • Linux Device Model 设计初衷 - Patrick Mochel
  • 内核文档:Documentation/driver-model/
  • 内核源码:drivers/base/*、include/linux/device.h
  • 推荐书籍:《Linux Device Drivers 第三版》《Linux内核设计与实现》

下一篇,我们将结合实际平台(如 i.MX8M、Raspberry Pi)对比分析设备树中的设备节点是如何与驱动匹配的,深入剖析设备模型运行时的数据流结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Embedding质量评估、空间塌缩、 Alignment Uniformity

Embedding质量的评估和空间塌缩的解决是自然语言处理(NLP)和推荐系统领域的关键问题。以下是综合多篇研究的总结: 一、Embedding质量评估方法 基准测试与任务指标 MTEB/C-MTEB:使用多语言或中文的基准测试集(如58个数据…

批量给dwg显示略缩图_c#插件实现(com)

如果,cad文件无略缩图: AutoCAD2021版本以上,命令行输入"netload "加载此dll插件,然后输入 “lst”,选择文件夹,即可一键实现给dwg增加略缩图。 效果如下: 附部分代码: …

婴幼儿托育服务与管理实训室:托育未来的基石

在社会对婴幼儿托育服务的重视程度不断加深的当下,专业托育人才的需求急剧增长。婴幼儿托育服务与管理专业作为培育这类人才的关键途径,要求学生熟练掌握婴幼儿身心发展、饮食营养以及卫生保健等基础知识,同时具备全面的照护与管理能力。要实…

(自用)若依生成左树右表

第一步: 在数据库创建树表和单表: SQL命令: 商品表 CREATE TABLE products (product_id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(255) , price DECIMAL(10, 2) , stock INT NOT NULL, category_id INT NOT NULL); 商品分类…

Linux:DNS服务配置(课堂实验总结)

遇到的问题,都有解决方案,希望我的博客能为你提供一点帮助。 操作系统:rocky Linux 9.5 ​​一、配置DNS服务器的核心步骤​​ 步骤 1:安装 BIND 软件​​ ​​检查是否安装​​: rpm -qa | grep "^bind"…

搭建一个Spring Boot聚合项目

1. 创建父项目 打开IntelliJ IDEA,选择 New Project。 在创建向导中选择 Maven,确保选中 Create from archetype,选择 org.apache.maven.archetypes:maven-archetype-quickstart。 填写项目信息: GroupId:com.exampl…

若依前后端分离版运行教程、打包教程、部署教程

后端打包教程 注意:需要先运行redis 2、前端运行教程 2.1安装依赖 2.2运行 打开浏览器查看,地址:http://localhost:80 3、前端打包教程 3.1打包 3.2运行打包好的文件,先找到打包好的文件 这是nginx的文件结构 将打包好的文件放到html目录下…

SpringAi 会话记忆功能

在使用chatGPT,豆包等产品后,就会发现他们的会话有“记忆”功能。 那么我们用API接口的话,这个是怎么实现的呢? 属于比较粗暴的方式,把之前的内容与新的提示词一起再次发给大模型。让我们看到他们有记忆功能。 下面介绍…

基于Python的经济循环模型构建与可视化案例

一、代码结构概览 该代码构建了一个包含经济数据生成、可视化分析和政策模拟的交互式经济系统仿真平台,主要包括三大模块: 多部门经济数据生成:模拟包含产业关联的复杂经济数据 增强型可视化:提供多维度的经济数据分析视图 Das…

第十六届蓝桥杯大赛软件赛省赛 Python 大学 B 组 部分题解

题面链接Htlang/2025lqb_python_b 个人觉得今年这套题整体比往年要简单许多,但是G题想简单了出大问题,预估50101015120860,道阻且长,再接再厉 A: 攻击次数 答案:103?181?题目没说明白每回合是…

C++基础精讲-05

文章目录 1.构造函数初始化列表1.1 初始化列表的使用1.2 有参构造函数的默认值 2.对象所占空间大小2.1 大小的计算2.2 内存对齐机制 3. 析构函数3.1 基本概念3.2 总结 4.valgrind工具集4.1 介绍4.2 memcheck的使用 5. 拷贝构造函数5.1 拷贝构造函数定义5.2 浅拷贝/深拷贝5.3 拷…

文章记单词 | 第28篇(六级)

一,单词释义 shirt /ʃɜːt/ n. 衬衫;衬衣commonly /ˈkɒmənli/ adv. 通常地;一般地;普遍地pick /pɪk/ v. 挑选;采摘;捡起;选择;n. 选择;鹤嘴锄;精华com…

安装低版本Pytorch GPU

网上很多教程都是自动安装,不指定版本,其实有大问题。而且torch、torchvision、torchaudio的版本必须是对应,所以一旦版本不对,就可能会出现各种问题。 其实Pytorch官网就已经给出了安装低版本的教程 登入Pytorch官网 点击previo…

2025认证杯挑战赛B题【 谣言在社交网络上的传播 】原创论文讲解(含完整python代码)

大家好呀,从发布赛题一直到现在,总算完成了认证杯数学中国数学建模网络挑战赛第一阶段B题目谣言在社交网络上的传播完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半…

并发编程--互斥锁与读写锁

并发编程–互斥锁与读写锁 文章目录 并发编程--互斥锁与读写锁1. 基本概念2. 互斥锁2.1 基本逻辑2.2 函数接口2.3示例代码12.4示例代码2 3. 读写锁3.1 基本逻辑3.2示例代码 1. 基本概念 互斥与同步是最基本的逻辑概念: 互斥指的是控制两个进度使之互相排斥&#x…

亲手打造可视化故事线管理工具:开发全流程、难点突破与开发过程经验总结

亲手打造可视化故事线管理工具:开发全流程、难点突破与开发过程经验总结 作为还没入门的业余编程爱好者,奋战了2天,借助AI开发一款FLASK小工具,功能还在完善中(时间轴可以跟随关联图缩放,加了一个用C键控制…

网络攻防技术-虚拟机安装和nmap端口扫描

文章是博主上实验课做的实验和心得体会,有些高深的地方我可能也比较一知半解,欢迎来交流。全文参考课程所习得,纯粹梳理知识点和分享,如有不妥请联系修改。 文章侧重实验部分,也会讲述实验相关的理论知识。理论后期如果…

中断的硬件框架

今天呢,我们来讲讲中断的硬件框架,这里会去举3个开发板,去了解中断的硬件框架: 中断路径上的3个部件: 中断源 中断源多种多样,比如GPIO、定时器、UART、DMA等等。 它们都有自己的寄存器,可以…

动手学深度学习:手语视频在VGG模型中的测试

前言 其他所有部分同上一篇AlexNet一样,所以就不再赘诉,直接看VGG搭建部分。 模型 VGG是第一个采取块进行模块化搭建的模型。 def vgg_block(num_convs,in_channels,out_channels):layers[]for _ in range(num_convs):layers.append(nn.Conv2d(in_ch…

信息学奥赛一本通 1498:Roadblocks | 洛谷 P2865 [USACO06NOV] Roadblocks G

【题目链接】 ybt 1498:Roadblocks 洛谷 P2865 [USACO06NOV] Roadblocks G 【题目考点】 1. 图论:严格次短路径 严格次短路的路径长度必须大于最短路的路径长度。 非严格次短路的路径长度大于等于最短路的路径长度。 【解题思路】 每个交叉路口是一…