Linux裝置模型分析之基本資料結構

2021-05-24 15:46:07 字數 2643 閱讀 6295

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內嵌到其他結構體裡來實現類似的 作用,...