您的位置:首页 > 文旅 > 美景 > 东营网站建设铭盛信息_海南网_搜全网的浏览器_黑马培训是正规学校吗

东营网站建设铭盛信息_海南网_搜全网的浏览器_黑马培训是正规学校吗

2025/4/16 2:44:28 来源:https://blog.csdn.net/Interview_TC/article/details/147093949  浏览:    关键词:东营网站建设铭盛信息_海南网_搜全网的浏览器_黑马培训是正规学校吗
东营网站建设铭盛信息_海南网_搜全网的浏览器_黑马培训是正规学校吗

🔍

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)对比分析设备树中的设备节点是如何与驱动匹配的,深入剖析设备模型运行时的数据流结构。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com