免費谘詢熱線

13621929115
常(cháng)見問題
您的位置: 主頁 > 新聞動態 > 常見問題

概念模型

發布日期:2023-04-04 22:41瀏(liú)覽次數:

 轉自(zì) http://www.wowotech.net1. 前言Kobject是Linux設備模型的基礎,也是設備模型中最難理解(jiě)的一部分(可參考Documentation/kobject.txt的表述)因此有必要先把(bǎ)它(tā)分析清楚。

    2. 基本概念Linux設備模型的核心是使(shǐ)用Bus、Class、Devic概念模型e、Driver四個核心數據結(jié)構,將大量的、不同功能的硬件設備(以及驅動該硬件設備的方法),以樹狀(zhuàng)結(jié)構的形式,進行歸納、抽象,從而方便Kernel的統一管理。

    而硬件設備的數量、種類(lèi)是非常(cháng)多的,這就決定了Kernel中將會有大(dà)量的(de)有關設備模型的數據結構這些數據結構一定有一些共同的功能,需(xū)要抽象出來統一概念模型實現,否則(zé)就會不可避免的產(chǎn)生冗餘代(dài)碼這就是Kobject誕生的背景(jǐng)。

    目前為止,Kobject主要提供如下功能(néng):1.通過parent指針,可以(yǐ)將所有Kobject以層次結構的形式組合起來(lái)2.使用一個引用計數(reference count),來記錄Kobject被引用的(de)次數,並在引用次數變為0時把它釋概念模型放(這是Kobject誕生時的唯一功能)。

    3.和sysfs虛擬文件係統配合(hé),將(jiāng)每一個Kobject及其特性,以文件的形式,開放到用戶空間(有關sysfs,會在其它文章中專(zhuān)門描述,本文不(bú)會涉及太多內容)注1:在(zài)Linux中,Kobject幾乎不會單獨存在。

    它的主(zhǔ)要功能,就是內嵌在(zài)一個大型的數據結構中,概念模型為(wéi)這個數據結構提供一些底層的功(gōng)能實現(xiàn) 注(zhù)2:Linux driver開發者,很少會直接(jiē)使用Kobject以及它提供的接口,而是使用構建在Kobject之上的設備模型接口。

    3. 代碼解析3.1 在Linux Kernel source code中的位置在Kernel源代碼中,Kobject由如下兩個文概念模(mó)型件實現: include/linux/kobject.h lib/kobject.c

    其中kobject.h為Kobject的頭文件,包含所(suǒ)有的數據結構定義(yì)和接口聲(shēng)明kobject.c為核心功能的實現3.2 主要的數據結構在描述數據結構(gòu)之前,有必要說明一下(xià)Kobject, Kset和Ktype這三個概概念模型念。

    Kobject是基本(běn)數(shù)據類型,每個Kobject都會在"/sys/“文件係統中以目錄的形式出現 Ktype代表Kobject(嚴格地講,是(shì)包含了Kobject的數據結構)的(de)屬性(xìng)操作集合(由於通用性,多個Kobject可能(néng)共用同一(yī)個屬性操作集,因此把Ktype獨立出來了)。

    注3:在設備模型中,kt概念模(mó)型ype的命(mìng)名(míng)和解釋,都非常抽(chōu)象,理解起來(lái)非常(cháng)困難,後麵會詳細(xì)說明Kset是(shì)一個特殊的(de)Kobject(因(yīn)此它也會在"/sys/“文件係統中以目錄的(de)形式出現),它用(yòng)來集合相似的Kobject(這些Kobject可以是相同屬(shǔ)性的,也可以不同(tóng)屬性的)。

    首先看一下Kobject的原型struct kobjec概念模型t {

    name,該Kobject的名(míng)稱,同時也是sysfs中的目錄名稱由於Kobj概念模型ect添加到Kernel時,需要根據名字注冊到sysfs中,之後就不能(néng)再直接(jiē)修改該(gāi)字(zì)段如果需要修改(gǎi)Kobject的名字,需要調用kobject_rename接(jiē)口,該接口會主動處理sysfs的相關事宜。

    entry,用於將Kobject加入到Kset中的list_headparent,指向parent 概念模型kobject,以此形成層次結構(在sysfs就表現為目錄結構)kset,該kobject屬於的Kset。

    可以為NULL如果存在(zài),且沒有指定(dìng)parent,則會把Kset作為(wéi)parent(別(bié)忘了Kset是一個(gè)特殊的Kobject)ktype,該Kobject屬於的kobj_type每個Kobject必概念模型須有一個ktype,或者Kernel會提示錯誤。

    sd,該Kobject在sysfs中(zhōng)的表示kref,"struct kref”類型(在include/linux/kref.h中定義(yì))的變量,為(wéi)一個可用於原子操作的引用計數(shù)state_initialized,指示該Kobject是否已經初始化,以在Ko概念模(mó)型bject的Init,Put,Add等操作時進行異常校驗。

    state_in_sysfs,指示該Kobject是否已在sysfs中呈(chéng)現,以便(biàn)在自動注銷時從sysfs中移除(chú)state_add_uevent_sent/state_remove_uevent_sent,記錄(lù)是否已經向用(yòng)戶空間發送ADD ue概(gài)念模型vent,如果(guǒ)有,且沒有發送remove uevent,則在自動注銷時,補發REMOVE uevent,以便讓用戶空間正確處(chù)理。

    uevent_suppress,如果該字段為1,則(zé)表示忽略所有上報的uevent事件注4:Uevent提供(gòng)了“用戶(hù)空間通知(zhī)”的功能實現,通過該功能,當內核中有Kobject概念模型的增(zēng)加、刪除、修改等動作時,會通知用戶空間。

    有關該功(gōng)能的具體內容,會在其它文章詳(xiáng)細描述Kset的原型為/**

    list/list_lock,用於保存該kset下所(suǒ)有的kobject的鏈表(biǎo)kobj,該kset自己的k概念模型object(kset是一個特(tè)殊的kobject,也會在sysfs中(zhōng)以(yǐ)目錄的(de)形式體現)uevent_ops,該kset的(de)uevent操(cāo)作函數集。

    當(dāng)任(rèn)何Kobject需要上報uevent時,都要調(diào)用它所從屬的kset的uevent_ops,添加環境變量,或者過濾event(kset可以決定哪些even概念(niàn)模型t可(kě)以上報)因此,如果一個kobject不屬於任(rèn)何kset時,是不允(yǔn)許發送uevent的。

    release,通過該回調函數(shù),可以將包含該種類型kobject的數據結構的內存空間釋放掉sysfs_ops,該種類型的Kobject的(de)sysfs文件係統(tǒng)接口default概念模型(xíng)_attrs,該種類型的Kobject的atrribute列表(所謂attribute,就是sysfs文件係統中的一個文件)。

    將會在Kobject添加到內核時,一並注冊到sysfs中child_ns_type/namespace,和文件係統(sysfs)的命名空間有關(guān),這裏不再詳細(xì)說明總結,Ktyp概念模型e以及整個Kobject機製的理解。

     Kobject的(de)核心功能是:保持一(yī)個引用計數,當該計數減為0時,自動釋放(由本文所(suǒ)講的kobject模塊負責) Kobject所占用的meomry空間(jiān)這就決定了Kobject必須是動態分配的(de)(隻有這樣才能(néng)動態釋放)。

    而Kobject大(dà)多(duō)數(shù)的使用(yòng)場景,是內(nèi)嵌在大型(xíng)的概念模型數據結構中(如Kset、device_driver等),因此這些大型的數據結構,也必須是動態分配、動態釋放的那(nà)麽釋放的時機是什麽呢?是內嵌的(de)Kobject釋放(fàng)時。

    但是Kobject的釋放是由Kobject模塊(kuài)自動完成的(在引用計數為0時(shí)),那麽怎麽一並(bìng)釋放(fàng)包含自(zì)己的大(dà)型數據(jù)結構呢?這時(shí)Ktype就派概念模型上用場了www.17C.com知道,Ktype中的release回調(diào)函數負責釋放Kobject(甚至是包含Kobject的數據結構)的內存空間,那麽Ktype及其內部(bù)函數,是由(yóu)誰實現(xiàn)呢?是由上層數據結構所在的模塊!因為隻有它,才(cái)清楚Kobject嵌在哪個數據結構中,並(bìng)通(tōng)過Kobject指針以及自身的數據結(jié)構類型,找到概念模型(xíng)需要釋放的上層數據結構的指針,然後釋放它。

    講到這裏,就清晰多了所(suǒ)以,每一個內嵌(qiàn)Kobject的數據(jù)結構,例如kset、device、device_driver等等,都要實現一個Ktype,並定義其中(zhōng)的回調函數同理,sysfs相關的操作也一樣,必須經過ktype的中轉,因為sysfs看(kàn)到的是Kobje概念模(mó)型ct,而真正的(de)文(wén)件操作的主體,是內嵌Kobject的上層數據結構!。

    順便提一下,Kobject是麵向對象的思想在Linux kernel中的極致體現,但C語言的優勢卻不在這裏,所以Linux kernel需要用比較巧(qiǎo)妙(也很囉嗦)的(de)手(shǒu)段去實現,3.3 功能分析3.3.1 Kobject使用流(liú)程(chéng)

    Kob概(gài)念模型ject大多數(shù)情況下(有一種例外,下麵會講)會嵌在其它數(shù)據結構(gòu)中使用,其使用流程如下:定義一個struct kset類型的指(zhǐ)針,並(bìng)在初始化時為它分配空間,添加到內核中根據實際情況,定義自己所需的數據結構原型,該(gāi)數據(jù)結構中包(bāo)含有Kobject 定義一個適合自己的ktype,並實現其中回調函數

    在需要使用概念模型到包含Kobject的數據結(jié)構時,動(dòng)態分配該數據(jù)結構,並分配Kobject空間,添加到內核中每一次引用數據結構時,調用kobject_get接(jiē)口增加引用計數;引用結束時,調用kobject_put接口,減少引用計數

    當引用計數減(jiǎn)少為0時,Kobject模塊調用ktype所提供(gòng)的release接口,釋放概念模型上層數據結(jié)構以及Kobject的內存空間上麵有提過,有一種例外,Kobject不再嵌在其它數據結構中,可以單獨使用,這個例外就是(shì):開發(fā)者隻需要在sysfs中創(chuàng)建(jiàn)一個目錄,而不需要其它(tā)的kset、ktype的操作。

    這(zhè)時可以直(zhí)接調用(yòng)kobject_create_and_add接口,分配一個kobject概念模型(xíng)結構並把它(tā)添加到kernel中3.3.2 Kobject的(de)分配和釋放前麵講過(guò),Kobject必須(xū)動態分配,而不能靜態定義或(huò)者位於堆棧之上,它的分配方法有兩種。

    通過kmalloc自行分配(一(yī)般是跟隨上層數據結構分配),並在(zài)初始化後添(tiān)加到kernel這種方法(fǎ)涉及如下接(jiē)口:extern void kobj概念模型ect_init(struct kobject *kobj, struct kobj_type *ktype);

    kobject_init,初始化通過kmalloc等(děng)內存分配函數獲得的struct kobject指針主(zhǔ)要執行邏(luó)輯為:確認ko概念模型bj和ktype不(bú)為空 如果該指針已經初始化過(判斷kobj->state_initialized),打印錯誤(wù)提示及堆棧信息(但不是致命錯誤,所以還可以(yǐ)繼續) 初始化kobj內部的參數,包括引用計數(shù)、list、各種標誌等 根據輸入參數,將ktype指針賦予kobj->ktype kobject_ad概念(niàn)模型d,將初始化完成的kobject添加到kernel中,參數(shù)包(bāo)括需要(yào)添加的(de)kobject、該kobject的parent(用於形(xíng)成層次結構,可(kě)以為空)、用於提供kobject name的格式化字符(fú)串。

    主要執行邏(luó)輯為:確認kobj不為空,確認kobj已(yǐ)經初始化(huà),否則錯誤退出 調用內部接口kobject_概念(niàn)模型add_varg,完成添加操作 kobject_init_and_add,是上(shàng)麵兩個接口的組合(hé),不再說明。


標簽:

產品推薦

Copyright © 2002-2020 上海潤(rùn)之模型(xíng)設計有限公司(sī) 版(bǎn)權所有 展示模型,展品模型(xíng),展廳模型,展示(shì)道具,展廳展品,展品道具,模型(xíng)定製(zhì),模型公司,上海(hǎi)模型公司 備案(àn)號:滬ICP備20018260號

13621929115
网站地图 www.17C.com_17.C-起草网登录在线_17c.一起草 在线观看视频_17c.com免费观看入口