從靜態綁定驅動模型到現代設備模型 —— 一次驅動架構的進化之旅

🔍

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.pswp.cn/pingmian/76611.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76611.shtml
英文地址,請注明出處:http://en.pswp.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. 圖論:嚴格次短路徑 嚴格次短路的路徑長度必須大于最短路的路徑長度。 非嚴格次短路的路徑長度大于等于最短路的路徑長度。 【解題思路】 每個交叉路口是一…