Linux裝置模型分析之(二) 裝置模型的基石

2021-10-22 21:32:13 字數 4040 閱讀 9455

linux裝置模型分析之(一):裝置模型核心

linux裝置模型分析之(二):裝置模型的基石

linux裝置模型分析之(三):sysfs

linux裝置模型分析之(四):class

linux裝置模型分析之(五):uevent

linux裝置模型通過sysfs檔案系統將裝置、驅動、匯流排組織成拓撲結構以目錄結構進行展示與管理以及與使用者空間通訊,如下圖:

這些功能的實現離不開裝置模型的基石:kobject。kobject是組成裝置模型的基本結構,device、bus、device_driver等資料結構體裡面都直接或間接包含有kobject成員。

//裝置

struct device

;//驅動

struct device_driver

;struct driver_private

;//匯流排

struct bus_type

;//類

struct class

struct subsys_private

;

通過kobject實現:

(1)物件生命週期的管理

kobject結構體內有一成員kref,為引用計數,用於跟蹤物件的生命週期。

(2)熱插拔事件

當系統中的硬體被熱插拔時,在kobject子系統控制下,將產生事件以通知使用者空間。

(3)sysfs表述

kobject結構體內有一成員sd,指向kobject在sysfs中的目錄項,用於描述sysfs中的樹狀關係。

(4)與使用者空間通訊

通過sysfs、uevent機制,實現與使用者空間的通訊。

kobject定義如下:

struct kobject 

;

kobj_type代表kobject的屬性操作集合,定義如下:

struct kobj_type 

struct sysfs_ops

;

kobject在sysfs中以目錄的形式出現,那麼檔案呢?答案是:attribute。 attribute在sysfs中以檔案的的形式出現。

struct attribute 

;

kset,也可以說是特殊的kobject,用來集合與管理多個同型別的kobject,定義如下:

struct kset 

;

kset與kobject結構體的關係,如下:

kobject大多數情況下不會單獨使用,而是嵌到其它資料結構中使用,如device、device_driver。註冊device、device_driver等就會呼叫到一些函式用於初始化與註冊內嵌的kobject。

這些函式有:

//初始化kobject

void

kobject_init

(struct kobject *kobj,

struct kobj_type *ktype)

;//將初始化完成的kobject新增到kernel中

intkobject_add

(struct kobject *kobj,

struct kobject *parent,

const

char

*fmt,..

.);//是上面兩個介面的組合

intkobject_init_and_add

(struct kobject *kobj,

struct kobj_type *ktype,

struct kobject *parent,

const

char

*fmt,..

.);//單獨使用kobject,可以呼叫該函式建立乙個kobject

struct kobject *

kobject_create

(void);

//建立並註冊kobject

struct kobject *

kobject_create_and_add

(const

char

*name,

struct kobject *parent)

;

初始化乙個kobject:

//需要傳入乙個kobj_type 

void

kobject_init

(struct kobject *kobj,

struct kobj_type *ktype)

static

void

kobject_init_internal

(struct kobject *kobj)

初始化之後,就可以呼叫kobject_add函式把kobject新增到kernel中:

//parent指向父kobject, kobject的name以可變參的形式傳入

intkobject_add

(struct kobject *kobj,

struct kobject *parent,

const

char

*fmt,..

.)va_start

(args, fmt)

;//增添kobject

retval =

kobject_add_varg

(kobj, parent, fmt, args)

;va_end

(args)

;return retval;

}static

__printf(3

,0)int

kobject_add_varg

(struct kobject *kobj,

struct kobject *parent,

const

char

*fmt, va_list vargs)

static

intkobject_add_internal

(struct kobject *kobj)..

....

error =

create_dir

(kobj)

;//在sysfs下建立目錄、檔案..

....

return error;

}

通過kobject_create_and_add函式,核心建立與初始化乙個kobject,其kobj_type為dynamic_kobj_ktype:

struct kobject *

kobject_create_and_add

(const

char

*name,

struct kobject *parent)

struct kobject *

kobject_create

(void

)

同樣的,對於kset的操作,也有類似的函式。

//初始化kset

void

kset_init

(struct kset *k)

;//新增kset

intkset_register

(struct kset *k)

;//建立並新增kset

struct kset *

kset_create_and_add

(const

char

*name,

const

struct kset_uevent_ops *uevent_ops,

struct kobject *parent_kobj)

;

Linux裝置模型

linux裝置驅動模型 我們在寫最簡單的裝置驅動程式的時候,我們將所有的硬體資訊都儲存在了驅動 中,這樣有乙個非常明顯的不足 會導致驅動程式的通用性極差,一旦硬體平台或硬體連線有鎖改變,就一定要修改驅動 為了解決這個問題,linux在2.6版本之後,新增了 匯流排 裝置 驅動 的linux裝置模型,...

linux裝置模型

linux核心的整體架構 linux裝置模型 linux裝置模型 1 基本概念 linux裝置模型 2 kobject linux裝置模型 3 uevent linux裝置模型 4 sysfs linux裝置模型 5 device和device driver linux裝置模型 6 bus linu...

裝置模型二 Kobject, Kset

struct kobject 接下來介紹幾個重要的函式,並通過原始碼進行分析 kobject add internal 說明 此函式要做是 1.建立kobj間的關係 2.向 sys反應目錄間關係 首先呼叫此函式前,kobj是已經初始化好的 if kobj kset 上面 含義 如果kobj有kset...