Linux設備模型_導航篇

1. Linux設備模型系列文章說明

所有文章均轉載自wowo科技,經過小編的重新排版、增添發佈到知乎上了。

轉載目的:

  • 能夠讓更多的小夥伴發現優質的文章;
  • 對原文進行重新排版梳理替換,讓文章更優質;
  • 本人目前還沒能力總結出這樣的文章,因此先轉載一些自認爲優質的文章,供大家享用。等我有所感悟之後,總結出更清晰明瞭的文章,供大家學習交流,共同進步。

所有封面圖均來源於網絡,並註明了來源,侵刪!!!

2. Linux設備模型系列文章目錄

2.0 Linux內核的整體架構

本文是“Linux內核分析”系列文章的第一篇,會以內核的核心功能爲出發點,描述Linux內核的整體架構,以及架構之下主要的軟件子系統。之後,會介紹Linux內核源文件的目錄結構,並和各個軟件子系統對應。
在這裏插入圖片描述

https://makelinux.github.io/kernel/map/

2.1 Linux設備模型(1)_基本概念

在“Linux內核的整體架構”中,蝸蝸有提到,由於Linux支持世界上幾乎所有的、不同功能的硬件設備(這是Linux的優點),導致Linux內核中有一半的代碼是設備驅動,而且隨着硬件的快速升級換代,設備驅動的代碼量也在快速增長。個人意見,這種現象打破了“簡潔就是美”的理念,是醜陋的。它導致Linux內核看上去非常臃腫、雜亂、不易維護。但蝸蝸也知道,這不是Linux的錯,Linux是一個宏內核,它必須面對設備的多樣性,並實現對應的驅動。

爲了降低設備多樣性帶來的Linux驅動開發的複雜度,以及設備熱拔插處理、電源管理等,Linux內核提出了設備模型(也稱作Driver Model)的概念。設備模型將硬件設備歸納、分類,然後抽象出一套標準的數據結構和接口。驅動的開發,就簡化爲對內核所規定的數據結構的填充和實現。

本文將會從設備模型的基本概念開始,通過分析內核相應的代碼,一步一步解析Linux設備模型的實現及使用方法。

在這裏插入圖片描述

http://www.wowotech.net/device_model/13.html

2.2 Linux設備模型(2)_Kobject

由“Linux設備模型(1)_基本概念”可知,Linux設備模型的核心是使用Bus、Class、Device、Driver四個核心數據結構,將大量的、不同功能的硬件設備(以及驅動該硬件設備的方法),以樹狀結構的形式,進行歸納、抽象,從而方便Kernel的統一管理。

而硬件設備的數量、種類是非常多的,這就決定了Kernel中將會有大量的有關設備模型的數據結構。這些數據結構一定有一些共同的功能,需要抽象出來統一實現,否則就會不可避免的產生冗餘代碼。這就是Kobject誕生的背景。
在這裏插入圖片描述

https://www.cnblogs.com/tanghuimin0713/p/3826904.html

2.3 Linux設備模型(3)_Uevent

Uevent是Kobject的一部分,用於在Kobject狀態發生改變時,例如增加、移除等,通知用戶空間程序。用戶空間程序收到這樣的事件後,會做相應的處理。

該機制通常是用來支持熱拔插設備的,例如U盤插入後,USB相關的驅動軟件會動態創建用於表示該U盤的device結構(相應的也包括其中的kobject),並告知用戶空間程序,爲該U盤動態的創建/dev/目錄下的設備節點,更進一步,可以通知其它的應用程序,將該U盤設備mount到系統中,從而動態的支持該設備。

在這裏插入圖片描述

http://www.wowotech.net/device_model/uevent.html

2.4 Linux設備模型(4)_sysfs

sysfs是一個基於RAM的文件系統,它和Kobject一起,可以將Kernel的數據結構導出到用戶空間,以文件目錄結構的形式,提供對這些數據結構(以及數據結構的屬性)的訪問支持。

sysfs具備文件系統的所有屬性,而本文主要側重其設備模型的特性,因此不會涉及過多的文件系統實現細節,而只介紹sysfs在Linux設備模型中的作用和使用方法。具體包括:

  • sysfs和Kobject的關係
  • attribute的概念
  • sysfs的文件系統操作接口

轉載者注:
本文代碼在4.x版本中大部分不存在!!!這部分內容變動比較大,但核心思想估計沒變,大家小心食用。
在這裏插入圖片描述

https://blog.csdn.net/qq_28992301/article/details/52381868

2.5 Linux設備模型(5)_device和device driver

device和device driver是Linux驅動開發的基本概念。Linux kernel的思路很簡單:驅動開發,就是要開發指定的軟件(driver)以驅動指定的設備,所以kernel就爲設備和驅動它的driver定義了兩個數據結構,分別是device和device_driver。因此本文將會圍繞這兩個數據結構,介紹Linux設備模型的核心邏輯,包括:

  • 設備及設備驅動在kernel中的抽象、使用和維護;
  • 設備及設備驅動的註冊、加載、初始化原理;
  • 設備模型在實際驅動開發過程中的使用方法。

注:在介紹device和device_driver的過程中,會遇到很多額外的知識點,如Class、Bus、DMA、電源管理等等,這些知識點都很複雜,任何一個都可以作爲一個單獨的專題區闡述,因此本文不會深入解析它們,而會在後續的文章中專門描述。
在這裏插入圖片描述

https://lwn.net/Kernel/LDD3/

2.6 Linux設備模型(6)_Bus

在Linux設備模型中,Bus(總線)是一類特殊的設備,它是連接處理器和其它設備之間的通道(channel)。爲了方便設備模型的實現,內核規定,系統中的每個設備都要連接在一個Bus上,這個Bus可以是一個內部Bus、虛擬Bus或者Platform Bus。

內核通過struct bus_type結構,抽象Bus,它是在include/linux/device.h中定義的。本文會圍繞該結構,描述Linux內核中Bus的功能,以及相關的實現邏輯。最後,會簡單的介紹一些標準的Bus(如Platform),介紹它們的用途、它們的使用場景。
在這裏插入圖片描述

https://lwn.net/Kernel/LDD3/

2.7 Linux設備模型(7)_Class

在設備模型中,Bus、Device、Device driver等等,都比較好理解,因爲它們對應了實實在在的東西,所有的邏輯都是圍繞着這些實體展開的。而本文所要描述的Class就有些不同了,因爲它是虛擬出來的,只是爲了抽象設備的共性。

舉個例子,一些年齡相仿、需要獲取的知識相似的人,聚在一起學習,就構成了一個班級(Class)。這個班級可以有自己的名稱(如295),但如果離開構成它的學生(device),它就沒有任何存在意義。另外,班級存在的最大意義是什麼呢?是由老師講授的每一個課程!因爲老師只需要講一遍,一個班的學生都可以聽到。不然的話(例如每個學生都在家學習),就要爲每人請一個老師,講授一遍。而講的內容,大多是一樣的,這就是極大的浪費。

設備模型中的Class所提供的功能也一樣了,例如一些相似的device(學生),需要向用戶空間提供相似的接口(課程),如果每個設備的驅動都實現一遍的話,就會導致內核有大量的冗餘代碼,這就是極大的浪費。所以,Class說了,我幫你們實現吧,你們會用就行了。

這就是設備模型中Class的功能,再結合內核的註釋:

A class is a higher-level view of a device that abstracts out low-level implementation details(include/linux/device.h line326),就容易理解了。
在這裏插入圖片描述

https://book.douban.com/subject/26600201/

2.8 Linux設備模型(8)_platform設備

在Linux設備模型的抽象中,存在着一類稱作“Platform Device”的設備,內核是這樣描述它們的(Documentation/driver-model/platform.txt):

Platform devices are devices that typically appear as autonomous
entities in the system. This includes legacy port-based devices and
host bridges to peripheral buses, and most controllers integrated into
system-on-chip platforms. What they usually have in common is direct
addressing from a CPU bus. Rarely, a platform_device will be connected
through a segment of some other kind of bus; but its registers will
still be directly addressable.

概括來說,Platform設備包括:

  • 基於端口的設備(已不推薦使用,保留下來只爲兼容舊設備,legacy);
  • 連接物理總線的橋設備;
  • 集成在SOC平臺上面的控制器;
  • 連接在其它bus上的設備(很少見);
  • 等等。

這些設備有一個基本的特徵:可以通過CPU bus直接尋址(例如在嵌入式系統常見的“寄存器”)。因此,由於這個共性,內核在設備模型的基礎上(device和device_driver),對這些設備進行了更進一步的封裝,抽象出paltform bus、platform device和platform driver,以便驅動開發人員可以方便的開發這類設備的驅動。

可以說,paltform設備對Linux驅動工程師是非常重要的,因爲我們編寫的大多數設備驅動,都是爲了驅動plaftom設備。本文我們就來看看Platform設備在內核中的實現。

在這裏插入圖片描述

http://www.wowotech.net/device_model/platform_device.html

2.9 Linux設備模型(9)_device resource management

相信每一個寫過Linux driver的工程師,都在probe函數中遇到過上面的困惑:要順序申請多種資源(IRQ、Clock、memory、regions、ioremap、dma、等等),只要任意一種資源申請失敗,就要回滾釋放之前申請的所有資源。於是函數的最後,一定會出現很多的goto標籤(如上面的exit_free_irq、exit_free_dma、等等),並在申請資源出錯時,小心翼翼的goto到正確的標籤上,以便釋放已申請資源。
在這裏插入圖片描述

http://www.wowotech.net/device_model/device_resource_management.html

3. 總結

剛入坑的小白,建議多讀幾遍,我看了將近5遍了,但仍然沒有全部理解Linux設備模型的精華,任重而道遠呀!!!



轉載不易,切勿剽竊!

在這裏插入圖片描述

歡迎大家關注我創建的微信公衆號——小白倉庫
原創經驗資料分享:包含但不僅限於FPGA、ARM、RISC-V、Linux、LabVIEW等軟硬件開發,另外分享生活中的趣事以及感悟。目的是建立一個平臺記錄學習過的知識,並分享出來自認爲有用的與感興趣的道友相互交流進步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章