1. 程式人生 > >Linux匯流排裝置驅動模型

Linux匯流排裝置驅動模型

Kobjec&Kset

Sysfs檔案系統
proc檔案系統是提供一個介面給使用者,讓使用者能夠檢視系統執行的狀態資訊,讓使用者能夠修改核心的一些引數,比如說列印級別 sysfs是基於ram的檔案系統,它是把核心的一些資料結構,以及這些資料結構中的一些屬性,以及他們之間的關係展示給使用者,暴露給使用者。 Linux2.6核心引入了sysfs檔案系統。sysfs被看成是與proc同類別的檔案系統。sysfs把連線在系統上的裝置和匯流排組織成分級的檔案,使其從使用者控制元件可以訪問到。 Sysfs被載入到/sys/目錄下,它的子目錄包括: (1)Block:在系統中發現的每個塊裝置在該目錄下對應一個子目錄,每個子目錄中又包含一些屬性檔案,它們描述了這個塊裝置的各方面屬性,如,裝置大小。(loop塊裝置是使用檔案來模擬的)
(2)Bus:在核心中註冊的每條匯流排在該目錄下對應一個子目錄,如:ide,pci,scsi,usb,pcmia。其中每個匯流排目錄內又包含了在整個系統中發現的屬於該匯流排型別的裝置,driver目錄包含了註冊到該匯流排的所有驅動。 (3)Class:將裝置按照功能進行的分類,如/sys/class/net目錄下包含了所有網路介面。 (4)Devices:包含系統所有的裝置 (5)Kernel:核心中的配置引數 (6)Module:系統中所有模組的資訊 (7)Firmware:系統中的韌體 (8)Fs:描述系統中的檔案系統 (9)Power:系統中的電源選項
一個裝置可能存在於3個目錄下,但是從物理上講可能是一個裝置,就看怎麼劃分。從功能上講是一個滑鼠,從總線上講是一個USB裝置
Kobject Kobject實現了基本的面向物件的管理機制,是構成Linux2.6裝置模型的核心結構。她與sysfs檔案系統緊密相連,在核心中註冊的每個kobject物件對應sysfs檔案系統中的一個目錄。





例項分析:Kobject.c

Kset能包含目錄,kobject智慧包含檔案不能包含目錄。 kset kest是具有相同型別的kobject的集合,在sysfs中體現成一個目錄,在核心中用kset資料結構表示,定義為:


熱插拔事件 在Linux系統中,當系統配置發生變化時,如:新增kset到系統;移動kobject,一個通知會從核心空間傳送到使用者空間,這就是熱插拔事件。熱插拔事件會導致使用者空間中相應的處理程式(如udev,mdev)被呼叫,這些處理程式會通過載入驅動程式,建立裝置節點等來相應熱插拔事件。

這三個函式什麼時候被呼叫?當該kset所管理的kobject和kset狀態發生變化時(如被加入,移動),這三個函式將被呼叫。(例:kobject_uevent呼叫) 。
例項分析:kset.c

裝置模型

隨著技術的不斷進步,系統的拓補結構也越來越複雜,對智慧電源管理、熱插拔的支援要求也越來越高,2.4核心已經難以滿足這些需求。為適應這種形式的需要,Linux2.6核心提供了全新的核心裝置模型。 裝置模型元素:匯流排,驅動,裝置 匯流排:匯流排是處理器和裝置之間的通道,在裝置模型中,所有的裝置都通過匯流排相連線,甚至是內部得虛擬platform匯流排。在Linux裝置模型中,匯流排由bus_type結構表示,定義在<linux/device.h>
匯流排的註冊和刪除:





例項分析:Bus_basic.c

裝置:


例項分析:Bus.c,Device.c

device


驅動:

當驅動找到與他匹配的裝置的時候,就會呼叫probe。




Platform驅動程式

Platform匯流排:Platform匯流排是Linux2.6核心加入的一種虛擬匯流排。platform機制的本身使用並不複雜,由兩部分組成,platform_device和paltform_driver. Platform驅動與傳統的裝置驅動模型相比,優勢在於platform機制將裝置本身的資源註冊進核心,由核心同一管理,在驅動程式使用這些資源時使用同一介面,這樣提高了程式的可移植性。











中斷處理

中斷概念: 為什麼需要中斷? 1.外設的處理速度一般慢於CPU 2.CPU不能一直等待外部事件 所以裝置必須有一種方法來通知CPU它的工作進度,這種方法就是中斷。 中斷實現:在Linux驅動程式中,為裝置實現一箇中斷包含兩個步驟: (1)向核心註冊中斷 (2)實現中斷處理函式


快速/慢速中斷:這兩種型別的中斷處理程式的主要區別在於,快速中斷保證中斷處理的原子性(不被打斷),而慢速中斷則不保證。換句話說,也就是“開啟中斷”標誌位(處理器IF)在執行快速中斷處理程式時是關閉的,因此在服務該中斷時,不會被其他型別的中斷打斷;而呼叫慢速中斷處理程式時,其他型別的中斷仍可以得到服務。 共享中斷:共享中斷是將不同裝置掛到同一個中斷訊號線上。Linux對共享的支援主要是PCI裝置提供服務。


中斷處理程式: 什麼是中斷處理程式?有何特別之處? 中斷處理程式就是普通的C程式碼。特別之處在於中斷處理程式是在中斷上下文中執行的,它的行為受到某些限制;(1)不能向用戶空間傳送或者接收資料;(2)不能使用可能引起阻塞的函式;(3)不能使用可能引起排程的函式。