freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

linux設備驅動編程模型之上層容器篇-在線瀏覽

2025-06-03 06:11本頁面
  

【正文】 igneduevent_suppress:1。/*設備驅動程序模型的核心數(shù)據(jù)結構,每個kobject數(shù)據(jù)結構對應于sysfs文件系統(tǒng)中的一個目錄*/struct kobject { const char *name。/*用于kobject所插入的鏈表的指針*/ struct kobject *parent。/*指向包含的kset*/ struct kobj_type *ktype。/*用同一種 struct sysfs_dirent 來統(tǒng)一設備模型中的 kset/kobject/attr/attr_group.*/ struct kref kref。/*指明kobject是否被初始化*/ unsigned int state_in_sysfs:1。/*熱插拔加載事件*/ unsigned int state_remove_uevent_sent:1。/*如果設置了uevent_suppress字段,說明不希望產(chǎn)生事件,忽略事件正確返回*/}。初始化時,kobject的引用計數(shù)設置為1。任何包含對象引用的代碼首先要增加該對象的引用計數(shù),當代碼結束后則減少它的引用計數(shù)。當引用計數(shù)跌到零時,對象便可以被銷毀,同時相關內存也都被釋放。kobjectkobject_get(struct*kobj)。kobject_put(struct*kobj)。krefrefcount。其中唯一的字段是用來存放引用計數(shù)的原子變量。在使用kref前,必須先通過kref_init()函數(shù)來初始化它:void kref_init(struct kref *kref){ atomic_set(amp。}正如你所看到的,這個函數(shù)簡單的將原子變量置1,所以kref一但被初始化,它表示的引用計數(shù)便固定為1。對開發(fā)者而言,在內核代碼中最好的方法是利用kref類型和它相應的輔助函數(shù),為自己提供一個通用的、正確的引用計數(shù)機制。3.共同特性的ktype如上所述,kobject是一個抽象而基本的對象。kobj_type(*release)(struct*kobj)。sysfs_ops4. struct**default_attrs。[cpp] view plaincopyprint?1. struct{2. voidkobject3. struct*sysfs_ops。attribute5. }。 struct sysfs_ops *sysfs_ops。}。該函數(shù)負責釋放所有kobject使用的內存和其它相關清理工作。sysfs_ops變量指向sysfs_ops結構體,其中包含兩個函數(shù),也就是對屬性進行操作的讀寫函數(shù)show()和store()。這些結構體定義了kobject相關的默認屬性。4.對象集合體ksetKset,顧名思義就是kobject對象的集合體,可以把它看成是一個容器,可將所有相關的kobject對象聚集起來,比如“全部的塊設備”就是一個kset。那么“為什么會需要這兩個類似的東西呢”。kset集合由kset結構體表示,定義于頭文件linux/中:[cpp] view plaincopyprint?1. struct{2. structlist。list_lock。5. kobject指針*/6. structkobj。kset_uevent_ops9. }。ksetlist_head/*包含在kset中的kobject類型的描述符*/3. spinlock_t4. /*嵌入的kobject結構,位于kset中的kobject,其parent字段指向這個內嵌的kobject7. /*指向用于處理kobject結構的過濾和熱插拔操作的回調函數(shù)表*/8. struct*uevent_ops。struct kset { struct list_head list。 /*嵌入的kobject結構,位于kset中的kobject,其parent字段指向這個內嵌的 kobject指針*/ struct kobject kobj。}。kobj指向的koject對象代表了該集合的基類,uevent_ops指向一個用于處理集合中kobject對象的熱插拔操作的結構體。=entrysysfs中,每一個dentry對應了一個dirent結構,dentryd每個kobject結構對應一個dirent結構。,在建立目錄和文件后,內存中會形成一棵以sysfs_root為根的目錄樹結構。這樣sysfs_dirent的組織就是sysfs的樹形結構的映射。sysfs_dirent就是用來做kobject與dentry的互相轉換用的*/2. struct{3. atomic_ts_count。5. struct*s_parent。sysfs_dirent7. const8. /*共用體包含四種不同的結構,分別是目錄、10. 其中目錄類型可以對應s_dir11. 中也有對的指針,因此在內核數(shù)據(jù)結kobjectsysfs_dirent13. */14. unionsysfs_elem_dir16. structs_symlink。sysfs_elem_attrs_attr。sysfs_elem_bin_attrs_bin_attr。20. 21. unsigned22. ino_t23. umode_t24. struct*s_iattr。[cpp] view plaincopyprint?1. /*structsysfs_dirent4. atomic_ts_active。sysfs_dirent6. struct*s_sibling。char*s_name。9. 符號鏈接文件、屬性文件、二進制屬性文件kobject,在相應的kobject12. 構,與是互相引用的;{15. structs_dir。sysfs_elem_symlink17. struct18. struct19. }。ints_flags。s_ino。s_mode。sysfs_inode_attrs25. }。 atomic_t s_active。 struct sysfs_dirent *s_sibling。 /*共用體包含四種不同的結構,分別是目錄、 符號鏈接文件、屬性文件、二進制屬性文件 其中目錄類型可以對應 kobject,在相應的 s_dir 中也有對 kobject 的指針,因此在內核數(shù)據(jù)結 構, kobject 與 sysfs_dirent 是互相引用的; */ union { struct sysfs_elem_dir s_dir。 struct sysfs_elem_attr s_attr。 }。 ino_t s_ino。 struct sysfs_inode_attrs *s_iattr。下面是設備驅動模型核心數(shù)據(jù)結構關系圖總結:相反,那些更為重要的結構體,比如在struct[cpp] view plaincopyprint?1. struct{2. structkobj。module4. constfile_operations5. structlist。dev。int8. }。cdevkobject3. struct*owner。struct*ops。list_head6. dev_t7. unsignedcount。struct cdev { struct kobject kobj。 const struct file_operations *ops。 dev_t dev。}。更重要的一點是,嵌入kobject的結構體可以成為對象層次架構中的一部分。對每個數(shù)據(jù)結構都有很多實現(xiàn)的函數(shù),這里我們只分析一個,即kset的注冊。我也是根據(jù)這個函數(shù)畫出上面的關系圖的。2. kset_registerinitializeaddkset.*kset.*/5. intkseterr。(!k)10. return11. /*基本的初始化*/12. kset_init(k)。=kkobj)。(err)16. return17. /*事件相關*/18. kobject_uevent(amp。KOBJ_ADD)。0。2. kset_registerinitializeaddkset.*kset.*/5. intkseterr。(!k)10. return11. /*基本的初始化*/12. kset_init(k)。=kkobj)。(err)16. return17. /*事件相關*/18. kobject_uevent(amp。KOBJ_ADD)。0。 if (!k) return EINVAL。 /*kobj以及其屬性建立sd樹*/ err = kobject_add_internal(amp。 if (err) return err。kkobj, KOBJ_ADD)。}kset初始化[cpp] view plaincopyprint?1. /***afor3. k:4. kset_init(struct*k)6. {7. /*kobject結構初始化*/8. kobject_init_internal(amp。9. /*初始化kset的kobject鏈表*/10. INIT_LIST_HEAD(amp。11. spin_lock_init(amp。12. }[cpp] view plaincopyprint?1. /***afor3. k:4. kset_init(struct*k)6. {7. /*kobject結構初始化*/8. kobject_init_internal(amp。9. /*初始化kset的kobject鏈表*/10. INIT_LIST_HEAD(amp。11. spin_lock_init(amp。12. }/** * kset_init initialize a kset for use * k: kset */void kset_init(struct kset *k){ /*kobject結構初始化*/ kobject_init_internal(amp。 /*初始化kset的kobject鏈表*/ INIT_LIST_HEAD(amp。 spin_lock_init(amp。}[cpp] view plaincopyprint?1. statickobject_init_internal(struct*kobj)2. {3. if5. kref_init(amp。/*引用計數(shù)加一*/6. INIT_LIST_HEAD(amp。/*初始化鏈表*/7. kobjstate_in_sysfs0。=9. kobjstate_remove_uevent_sent0。=/*已經(jīng)初始化*/11. }[cpp] view plaincopyprint?1. statickobject_init_internal(struct*kobj)2. {3. if5. kref_init(amp。/*引用計數(shù)加一*/6. INIT_LIST_HEAD(amp。/*初始化鏈表*/7. kobjstate_in_sysfs0。=9. kobjstate_remove_uevent_sent0。=/*已經(jīng)初始化*/11. }static void kobject_init_internal(struct kobject *kobj){ if (!kobj) return。kobjkref)。kobjentry)。 kobjstate_add_
點擊復制文檔內容
公司管理相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1