linux隨著硬體裝置的發展及核心版本的演進,裝置模型也變得越來月複雜,早先看了《linux裝置驅動程式》覺得一頭霧水,又看了許多資料和高手的帖子,總算有了一定認識,下面寫出來和linux核心愛好者分享一下。
一、底層資料結構:kobject 和kset1、
kobject
核心物件:
linux2.6
裝置模型的最底層核心結構,該資料結構使所有裝置在底層都具有統一的介面,每乙個在核心中註冊的
kobject
物件都對應於
sysfs
檔案系統中的乙個目錄。
kobject
在核心中對應有一套申請,初始化,新增,註冊,計數操作,釋放等函式。
2、kset
核心物件集合:具有相同型別的
kobject
的集合。
3、subsystem
核心物件子系統:一系列
kset
的集合,描述了某一類子系統,如
block_subsys
表示所有的塊裝置,對應於
susfs
檔案系統中的
block
目錄。device_subsys
對應於sysfs
中的devices
目錄,描述系統中的所有的裝置,說直白了其實也是
kset
,kset
的型別由內嵌的
ktype
結構描述。
由此可以看出,
kobject
類似於物件導向程式設計中的基類,經過層層繼承封裝來實現上層的裝置驅動模型。
二、裝置模型層次關係:
bus_type
,device
,device_driver
驅動核心可以註冊多種型別的
bus;每種
bus可以掛載許多
device
(通過kset devices
);每種
bus下可以有很多
device_driver
(通過kset drivers
);每個
device_driver
可以處理一組
devices
。bus
是處理器與乙個或多個裝置之間的通道。在裝置模型中,所有的裝置都通過匯流排相連。每個匯流排都有自己的子系統,乙個匯流排中包含了兩個
kset
,乙個是匯流排的驅動程式,乙個是插入匯流排的所有裝置。
device
描述裝置相關的資訊,裝置之間的層次關係,以及裝置與匯流排、驅動之間的關係。通常
device
結構體不單獨使用,而是包含在更大的結構體中。
device_driver
結構體描述系統中的每個驅動程式,通常也不直接使用,而是包含在更大的結構體中。
三、物件導向思想在
linux
裝置模型中的體現:
核心中常見到封裝了資料和方法的結構體,這種結構體套結構體的結構體可以看成是物件導向封裝特性的實現。而linux
裝置模型展現的更多的是繼承方面的實現。以《linux
裝置驅動程式》中的pci_driver
為例,它的父類是device_driver
,而更上一層是乙個kobject
。在c++
中,繼承乙個父類則子類中相應的包含父類的乙個例項。核心中也是通過包含乙個父類的實體來實現這種派生關係。因此,乙個pci_driver
內部必然包含乙個device_driver,
同樣,device_driver
內部必然包含乙個kobject
。註冊乙個模型的過程類似於物件導向中建構函式的呼叫。子類需要呼叫父類建構函式來完成自身的構造。而註冊乙個pci_driver
的過程如下:
pci_register_driver(struct pci_driver *driver)
-->driver_register(&drv->driver);
-->kobject_register(&drv->kobj);
這正符合這物件導向的思路。所以鄙人在想,如果
c++在在某些底層操作方面進行優化和該進,那麼用
c++改寫的
linux
會是會不會更高效,鄙人拙見。。。
Linux裝置模型分析之(五) uevent
linux裝置模型分析之 一 裝置模型核心 linux裝置模型分析之 二 裝置模型的基石 linux裝置模型分析之 三 sysfs linux裝置模型分析之 四 class linux裝置模型分析之 五 uevent uevent是kobject的一部分,用於在kobject狀態發生改變時,例如增加...
Linux裝置模型分析之(二) 裝置模型的基石
linux裝置模型分析之 一 裝置模型核心 linux裝置模型分析之 二 裝置模型的基石 linux裝置模型分析之 三 sysfs linux裝置模型分析之 四 class linux裝置模型分析之 五 uevent linux裝置模型通過sysfs檔案系統將裝置 驅動 匯流排組織成拓撲結構以目錄結...
linux裝置模型之kobject
kobject 結構 在linux核心裡,kobject是組成linux裝置模型的基礎,乙個kobject對應sysfs裡的 乙個目錄。從物件導向的角度來說,kobject可以看作是所有裝置物件的基類,因為c 語言並沒有物件導向的語法,所以一般是把kobject內嵌到其他結構體裡來實現類似的 作用,...