kobject是組成裝置device、驅動driver、匯流排bus、class的基本結構。如果把前者看成基類,則後者均為它的派生產物。device、driver、bus、class構成了裝置模型,而kobject內嵌於其中,將這些裝置模型的部件組織起來,並形成了sysfs檔案系統。kobject就是device、driver、bus、class在檔案系統中的代表。在sysfs操作裝置時,也必須通過kobject這個中間人來完成。kobject的主要功能如下:
物件的引用計數
通常乙個核心物件被建立時,不可能知道該物件存活的時間。跟蹤此物件生命週期的乙個方法是使用引用計數。當核心中沒有**持有該物件的引用時,該物件將結束自己的有效生命週期,並且可以被刪除。
sysfs表述
在sysfs中顯示的每乙個物件,都對應乙個kobject,它被用來與核心互動並建立它的可見表述。
資料結構關聯
從整體上看,裝置模型是乙個友好而複雜的資料結構,通過在其間的大量連線而構成乙個多層次的體系結構。kobject實現了該結構並把它們聚合在一起。
uevent事件處理
當系統中的硬體被熱插拔時,在kobject子系統控制下,將產生事件以通知使用者空間。
kobjects 在核心中對應有一套申請,初始化,新增,註冊,計數操作,釋放等函式
struct kobject {
const char *name; /*kobject的名字,每個kobject都對應著sysfs下的乙個資料夾,該名字也是對應的資料夾的名字。*/
struct list_head entry; /*雙向鍊錶指標,用於將同一kset集合中的kobject鏈結到一起,便於訪問*/
struct kobject *parent; /*kobject對應的父kobject節點,在sysfs表現為上一級目錄*/
struct kset *kset; /*kobject所在的集合的指標,kset概念將在kset一節中描述*/
struct kobj_type *ktype; /*kobject物件型別指標,隨後將會介紹*/
struct sysfs_dirent *sd; /*sd用於表示vfs檔案系統的目錄項,由此可見它是裝置與檔案之間的橋梁。在sysfs節會對此結構進行分析*/
struct kref kref; /*物件引用計數器。引用計數器的作用前面已經講過*/
unsigned int state_initialized:1; /*初始化標誌位,在物件初始化時被置位*/
unsigned int state_in_sysfs:1; /*kobject物件在sysfs中的狀態,建立則置1,否則為0。亦即kobject對應的目錄在sysfs中是否被建立*/
unsigned int state_add_uevent_sent:1; /*新增裝置的uevent事件是否傳送標誌,新增裝置時會向使用者空間傳送uevent事件,請求新增裝置*/
unsigned int state_remove_uevent_sent:1; /*刪除裝置的uevent事件是否傳送標誌,刪除裝置時會向使用者空間傳送uevent事件,請求解除安裝裝置*/
unsigned int uevent_suppress:1;
kobject_init();
// kobject 初始化函式;
kobject_add();
//將kobj 物件加入linux 裝置層次。掛接該kobject 物件到kset 的list 鏈中,增加父目錄各級kobject 的引用計數,在其 parent 指向的目錄下建立檔案節點,並啟動該型別核心物件的hotplug 函式
kobject_init_and_add();
//kobject_init() and kobject_add()函式的結合,返回值與kobject_add()相同;與kobject_create_and_add的區別是,kobject結構體必須已經建立好,動態建立或者靜態宣告均可;
kobject_del();
//從linux 裝置層次(hierarchy)中刪除kobj 物件;
kobject_create();
//動態的建立乙個kobject結構體;
kobject_create_and_add();
// kobject_create_and_add動態建立了乙個kobject結構體,將其初始化,將其加入到kobject層次中,並最終返回所建立的 kobject的指標,當然如果函式執行失敗,則返回null;
kobject_rename();
//改變乙個kobject的名字;
kobject_move();
//將乙個kobject從乙個層次移動到另乙個層次;
kobject_get();
//將kobj 物件的引用計數加1,同時返回該物件的指標;
kobject_put();
//將kobj 物件的引用計數減1,如果引用計數降為0,則呼叫kobject_release()釋放該kobject 物件;
kobject_get_path();
//返回kobject的路徑;
kobject_set_name();
//設定kobject的名字
Kobject結構體分析
kobject是組成裝置device 驅動driver 匯流排bus class的基本結構。如果把前者看成基類,則後者均為它的派生產物。device driver bus class構成了裝置模型,而kobject內嵌於其中,將這些裝置模型的部件組織起來,並形成了sysfs檔案系統。kobject就...
usb setup請求結構體分析
在usb通訊裡,從主控器發出來的第乙個配置包就是裝置描述符配置包,目的只有乙個,就是獲取插入的usb屬性,以便載入合適的驅動程式。現在就來詳細地分析一下裝置描述符包的定義。在usb2.0的協議裡找到9.3 usb device requests裡就找到這個結構的定義,這裡我使用c的定義結構如下 ty...
TCP UDP IP報頭結構體分析
tcp udp ip報頭結構體分析 tcp資料段格式 tcp是一種可靠的 面向連線的位元組流服務。源主機在傳送資料前需要先和目標主機建立連線。然後,在此連線上,被編號的資料段按序收發。同時,要求對每個資料段進行確認,保證了可靠性。如果在指定的時間內沒有收到目標主機對所發資料段的確認,源主機將再次傳送...