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

正文內(nèi)容

linux設(shè)備驅(qū)動(dòng)編程模型之上層容器篇(已修改)

2025-04-28 06:11 本頁(yè)面
 

【正文】 Linux設(shè)備驅(qū)動(dòng)編程模型之上層容器篇 分類: Linux 20121006 17:18 245人閱讀 評(píng)論(0) 收藏 舉報(bào) linux編程struct數(shù)據(jù)結(jié)構(gòu)listnull——統(tǒng)一設(shè)備模型(devicemodel)。設(shè)備模型提供了一個(gè)獨(dú)立的機(jī)制專門來(lái)表示設(shè)備,并描述其在系統(tǒng)中的拓?fù)浣Y(jié)構(gòu),從而使得系統(tǒng)具有以下優(yōu)點(diǎn):l代碼重復(fù)最小化。l提供諸如引用計(jì)數(shù)這樣的統(tǒng)一機(jī)制。l可以列舉系統(tǒng)中所有的設(shè)備,觀察它們的狀態(tài),并且查看它們連接的總線。l可以將系統(tǒng)中的全部設(shè)備結(jié)構(gòu)以樹的形式完整、有效的展現(xiàn)出來(lái)——包括所有的總線和內(nèi)部連接。l可以將設(shè)備和其對(duì)應(yīng)的驅(qū)動(dòng)聯(lián)系起來(lái),反之亦然。l可以將設(shè)備按照類型加以歸類,比如分類為輸入設(shè)備,而無(wú)需理解物理設(shè)備的拓?fù)浣Y(jié)構(gòu)。l可以沿設(shè)備樹的葉子向其根的方向依次遍歷,以保證能以正確順序關(guān)閉各設(shè)備的電源。最后一點(diǎn)是實(shí)現(xiàn)設(shè)備模型的最初動(dòng)機(jī)。若想在內(nèi)核中實(shí)現(xiàn)智能的電源管理,就需要來(lái)建立表示系統(tǒng)中設(shè)備拓?fù)潢P(guān)系的樹結(jié)構(gòu)。當(dāng)在樹上端的設(shè)備關(guān)閉電源時(shí),內(nèi)核必須首先關(guān)閉該設(shè)備節(jié)點(diǎn)以下的(處于葉子上的)設(shè)備電源。比如內(nèi)核需要先關(guān)閉一個(gè)USB鼠標(biāo),然后才可關(guān)閉USB控制器;同樣內(nèi)核也必須在關(guān)閉PCI總線前先關(guān)閉USB控制器。簡(jiǎn)而言之,若要準(zhǔn)確而又高效的完成上述電源管理目標(biāo),內(nèi)核無(wú)疑需要一顆設(shè)備樹。一、原理雖然設(shè)備模型的初衷是為了方便電源管理而提供出的一種設(shè)備拓?fù)浣Y(jié)構(gòu),但是,為了方便調(diào)試,設(shè)備模型的開發(fā)者決定將設(shè)備結(jié)構(gòu)樹導(dǎo)出為一個(gè)文件系統(tǒng),這就是sysfs文件系統(tǒng),它可以幫助用戶能以一個(gè)簡(jiǎn)單文件系統(tǒng)的方式來(lái)觀察系統(tǒng)中各種設(shè)備的拓?fù)浣Y(jié)構(gòu)。這個(gè)舉措很快被證明是非常明智的,首先sysfs代替了先前處于/proc下的設(shè)備相關(guān)文件;另外它為系統(tǒng)對(duì)象提供了一個(gè)很有效的視圖。實(shí)際上,sysfs起初被稱為driverfs。最終sysfs使得我們認(rèn)識(shí)到一個(gè)全新的對(duì)象模型非常有利于系統(tǒng)。,而且?guī)缀醵己翢o(wú)例外的將其掛載。圖一是掛載于/sys目錄下的sysfs文件系統(tǒng)的局部視圖。/sys|—block/||–fd0||–hda||–dev||–device../../devices/pci0000:00/0000:00:|…|–bus/|–class/|–devices/|–firmware/|–power/|–module/Sysfs的根目錄下包含了七個(gè)目錄:block,bus,class,devices,firmware,,module和power。block目錄下的每個(gè)子目錄都對(duì)應(yīng)著系統(tǒng)中的一個(gè)塊設(shè)備。反過(guò)來(lái),每個(gè)目錄下又都包含了該塊設(shè)備的所有分區(qū)。bus目錄提供了一個(gè)系統(tǒng)總線視圖。class目錄包含了以高層功能邏輯組織起來(lái)的系統(tǒng)設(shè)備視圖。devices目錄是系統(tǒng)中設(shè)備拓?fù)浣Y(jié)構(gòu)視圖,它直接映射出了內(nèi)核中設(shè)備結(jié)構(gòu)體的組織層次。firmware目錄包含了一些諸如ACPI,EDD,EFI等低層子系統(tǒng)的特殊樹。power目錄包含了系統(tǒng)范圍的電源管理數(shù)據(jù)。其中最重要的目錄是devices,該目錄將設(shè)備模型導(dǎo)出到用戶空間。目錄結(jié)構(gòu)就是系統(tǒng)中實(shí)際的設(shè)備拓?fù)洹F渌夸浿械暮芏鄶?shù)據(jù)都是將devices目錄下的數(shù)據(jù)加以轉(zhuǎn)換加工而得。比如,/sys/class/net/目錄是以注冊(cè)網(wǎng)絡(luò)接口這一高層概念來(lái)組織設(shè)備關(guān)系的,在這個(gè)目中可能會(huì)有目錄eth0,它里面包含的devices文件其實(shí)就是一個(gè)指回到devices下實(shí)際設(shè)備目錄的符號(hào)連接。隨便看看任何你可訪問(wèn)到的Linux系統(tǒng),這種系統(tǒng)設(shè)備視圖相當(dāng)準(zhǔn)確和漂亮,而且可以看到class中的高層概念與devices中的低層物理設(shè)備,以及bus中的實(shí)際驅(qū)動(dòng)程序之間互相聯(lián)絡(luò)是非常廣泛的。Sysfs文件系統(tǒng)的目標(biāo)就是要展現(xiàn)設(shè)備驅(qū)動(dòng)模型組件之間的層次關(guān)系。在Linux中,sysfs文件系統(tǒng)被安裝于/sys目錄下:mounttsysfssysfs/sys/sys|—block/||–fd0||–hda||–dev||–device../../devices/pci0000:00/0000:00:|…|–bus/|–class/|–devices/|–firmware/|–power/|–module/那么,在這樣的目錄樹中,哪些目錄是驅(qū)動(dòng)模型要關(guān)注的對(duì)象?bus系統(tǒng)中用于連接設(shè)備的總線,在內(nèi)核中對(duì)應(yīng)的結(jié)構(gòu)體為structbus_type{…}。device內(nèi)核所識(shí)別的所有設(shè)備,依照連接它們的總線對(duì)其進(jìn)行組織,對(duì)應(yīng)的結(jié)構(gòu)體為structdevice{…}。class系統(tǒng)中設(shè)備的類型(聲卡,網(wǎng)卡,顯卡,輸入設(shè)備等),同一類中包含的設(shè)備可能連接到不同的總線,對(duì)應(yīng)的結(jié)構(gòu)體為structclass{…}。為什么不對(duì)Power進(jìn)行單獨(dú)描述?實(shí)際上,Power與device有關(guān),它只是device中的一個(gè)字段。除此之外,立馬閃現(xiàn)在我們腦子里的對(duì)象還有:driver在內(nèi)核中注冊(cè)的設(shè)備驅(qū)動(dòng)程序,對(duì)應(yīng)的結(jié)構(gòu)體為structdevice_driver{…}。以上bus,device,class,driver,是可以感受到的對(duì)象,在內(nèi)核中都用相應(yīng)的結(jié)構(gòu)體來(lái)描述。而實(shí)際上,按照面向?qū)ο蟮乃枷?,我們需要抽象出一個(gè)最基本的對(duì)象,這就是設(shè)備模型的核心對(duì)象kobject.Kobject是Linux,在內(nèi)核中就是一個(gè)structkobject結(jié)構(gòu)體。有了這個(gè)數(shù)據(jù)結(jié)構(gòu),內(nèi)核中所有設(shè)備在底層都具有統(tǒng)一的接口,kobject提供基本的對(duì)象管理,它與sysfs文件系統(tǒng)緊密關(guān)聯(lián),每個(gè)在內(nèi)核中注冊(cè)的kobject對(duì)象都對(duì)應(yīng)于sysfs文件系統(tǒng)中的一個(gè)目錄。Kobject是組成設(shè)備模型的基本結(jié)構(gòu)。類似于C++中的基類,它嵌入于更大的對(duì)象中,即所謂的容器,如上面提到的bus,class,devices,drivers都是典型的容器,它們是描述設(shè)備模型的組件。二、主要對(duì)象介紹1,核心對(duì)象kobject話說(shuō)kobject是驅(qū)動(dòng)模型的核心對(duì)象,但在sysfs文件系統(tǒng)中似乎并沒(méi)有對(duì)應(yīng)的項(xiàng),而這種看似“無(wú)”,實(shí)際上蘊(yùn)藏著“有”。這“有”從何說(shuō)起。回想文件系統(tǒng)中的核心對(duì)象“索引節(jié)點(diǎn)(indoe)”和目錄項(xiàng)“dentry”:Inode—與文件系統(tǒng)中的一個(gè)文件相對(duì)應(yīng)(而實(shí)際上,只有文件被訪問(wèn)時(shí),才在內(nèi)存創(chuàng)建索引節(jié)點(diǎn))。Dentry每個(gè)路徑中的一個(gè)分量,例如路徑/bin/ls,其中/、bin和ls三個(gè)都是目錄項(xiàng),只是前兩個(gè)是目錄,而最后一個(gè)是普通文件。也就是說(shuō),目錄項(xiàng)目錄項(xiàng)或者是一子目錄,或者是一個(gè)文件。從上面的定義可以看出,indoe和dentry誰(shuí)的包容性更大?當(dāng)然是dentry!那么,kobject與dentry有何關(guān)系?由此我們可以推想,把dentry作為kobject中的一個(gè)字段,恍然間,kobject變得強(qiáng)大起來(lái)了。何謂“強(qiáng)大“,因?yàn)檫@樣以來(lái),就可以方便地將kobject映射到一個(gè)dentry上,也就是說(shuō),kobject與/sys下的任何一個(gè)目錄或文件相對(duì)應(yīng)了,進(jìn)一步說(shuō),把kobject導(dǎo)出形成文件系統(tǒng)就變得如同在內(nèi)存中構(gòu)建目錄項(xiàng)一樣簡(jiǎn)單。由此可知,kobject其實(shí)已經(jīng)形成一棵樹了。這就是以隱藏在背后的對(duì)象模型為橋梁,將驅(qū)動(dòng)模型和sysfs文件系統(tǒng)全然聯(lián)系起來(lái)。由于kobject被映射到目錄項(xiàng),同時(shí)對(duì)象模型層次結(jié)構(gòu)也已經(jīng)在內(nèi)存形成一個(gè)樹,因此sysfs的形成就水到渠成了。既然,kobject要形成一顆樹,那么其中的字段就要有parent,以表示樹的層次關(guān)系;另外,kobject不能是無(wú)名氏,得有name字段,按說(shuō),目錄或文件名并不會(huì)很長(zhǎng),但是,sysfs文件系統(tǒng)為了表示對(duì)象之間復(fù)雜的關(guān)系,需要通過(guò)軟鏈接達(dá)到,而軟鏈接常常有較長(zhǎng)的名字。[cpp] view plaincopyprint?1. /*設(shè)備驅(qū)動(dòng)程序模型的核心數(shù)據(jù)結(jié)構(gòu),每個(gè)kobject2. 數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)于sysfs文件系統(tǒng)中的一個(gè)目錄*/3. structkobject{4. constchar*name。/*指向含有容器名稱的字符*/5. structlist_headentry。/*用于kobject所插入的鏈表的指針*/6. structkobject*parent。/*指向父kobject*/7. structkset*kset。/*指向包含的kset*/8. structkobj_type*ktype。/*指向kobject的類型的描述符*/9. structsysfs_dirent*sd。/*用同一種structsysfs_dirent來(lái)統(tǒng)一設(shè)備模型中的kset/kobject/attr/attr_group.*/10. structkrefkref。/*容器的引用計(jì)數(shù)器*/11. unsignedintstate_initialized:1。/*指明kobject是否被初始化*/12. unsignedintstate_in_sysfs:1。/*指明是否使用了sysfs*/13. unsignedintstate_add_uevent_sent:1。/*熱插拔加載事件*/14. unsignedintstate_remove_uevent_sent:1。/*熱插拔卸載事件*/15. unsignedintuevent_suppress:1。/*如果設(shè)置了uevent_suppress字段,說(shuō)明不希望產(chǎn)生事件,忽略事件正確返回*/16. }。[cpp] view plaincopyprint?1. /*設(shè)備驅(qū)動(dòng)程序模型的核心數(shù)據(jù)結(jié)構(gòu),每個(gè)kobject2. 數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)于sysfs文件系統(tǒng)中的一個(gè)目錄*/3. structkobject{4. constchar*name。/*指向含有容器名稱的字符*/5. structlist_headentry。/*用于kobject所插入的鏈表的指針*/6. structkobject*parent。/*指向父kobject*/7. structkset*kset。/*指向包含的kset*/8. structkobj_type*ktype。/*指向kobject的類型的描述符*/9. structsysfs_dirent*sd。/*用同一種structsysfs_dirent來(lái)統(tǒng)一設(shè)備模型中的kset/kobject/attr/attr_group.*/10. structkrefkref。/*容器的引用計(jì)數(shù)器*/11. unsignedintstate_initialized:1。/*指明kobject是否被初始化*/12. unsignedintstate_in_sysfs:1。/*指明是否使用了sysfs*/13. unsignedintstate_add_uevent_sent:1。/*熱插拔加載事件*/14. unsignedintstate_remove_uevent_sent:1。/*熱插拔卸載事件*/15. unsignedintuevent_suppress:1。/*如果設(shè)置了uevent_suppress字段,說(shuō)明不希望產(chǎn)生事件,忽略事件正確返回*/16. }。/*設(shè)備驅(qū)動(dòng)程序模型的核心數(shù)據(jù)結(jié)構(gòu),每個(gè)kobject數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)于sysfs文件系統(tǒng)中的一個(gè)目錄*/struct kobject { const char *name。/*指向含有容器名稱的字符*/ struct list_head entry。/*用于kobject所插入的鏈表的指針*/ struct kobject *parent。/*指向父kobject*/ struct kset *kset。/*指向包含的kset*/ struct kobj_type *ktype。/*指向kobject的類型的描述符*/ struct sysfs_dirent *sd。/*用同一種 struct sysfs_dirent 來(lái)統(tǒng)一設(shè)備模型中的 kset/kobject/attr/attr_group.*/ struct kref kref。/*容器的引用計(jì)數(shù)器*/ unsigned int state_initialized:1。/*指明kobject是否被初始化*/ unsigned int state_in_sysfs:1。/*指明是否使用了sysfs*/ unsigned int state_add_uevent_sent:1。/*熱插拔加載事件*/ unsigned int state_remove_uevent_sent:1。/*熱插拔卸載事件*/ unsigned int uevent_suppress:1。/*如果設(shè)置了uevent_suppress字段,說(shuō)明不希望產(chǎn)生事件,忽略事件正確返回*/}。2.引用計(jì)數(shù)krefkobject的主要功能之一就是為我們提供了一個(gè)統(tǒng)一的引用計(jì)數(shù)系統(tǒng),為什么說(shuō)它具有“統(tǒng)一”的能力?那是因?yàn)閗object是“基”對(duì)象,就像大廈的基地,其他對(duì)象(如devic,bus,class,device_driver等容器)都將其包含,以后,其他對(duì)象的引用技術(shù)繼承或封裝kobject的引用技術(shù)就可以了。初始化時(shí),kobject的引用計(jì)數(shù)設(shè)置為1。只要引用計(jì)數(shù)不為零,那么該對(duì)象就會(huì)繼續(xù)保留在內(nèi)存中,也可以說(shuō)是被“釘住”了。任何包含對(duì)象引用的代碼首先要增加該對(duì)象的引用計(jì)數(shù),當(dāng)代碼結(jié)束后則減少它的引用計(jì)數(shù)。增加引用計(jì)數(shù)稱為獲得(getting)對(duì)象的引用,減少引用計(jì)數(shù)稱為釋放(putting)對(duì)象的引用。當(dāng)引用計(jì)數(shù)跌到零時(shí),對(duì)象便可以被銷毀,同時(shí)相關(guān)內(nèi)存也都被釋放。增加一個(gè)引用計(jì)數(shù)可通過(guò)koject_get()函數(shù)完成:structkobject*kobject_get(structkobject*kobj)。該函數(shù)正常情況下將返回一個(gè)指向kobject的指針,如果失敗則返回NULL指針;減少引用計(jì)數(shù)通過(guò)kobject_put()完成:voidkobject_put(structkobject*kobj)。如果對(duì)應(yīng)的kobject的引用計(jì)數(shù)減少到零,則與該kobject關(guān)聯(lián)的ktype中的析構(gòu)函數(shù)將被調(diào)用。我們深入到引用計(jì)數(shù)系統(tǒng)的內(nèi)部去看,會(huì)發(fā)現(xiàn)kobject的引用計(jì)數(shù)是通過(guò)kref結(jié)構(gòu)體實(shí)現(xiàn)的,該結(jié)構(gòu)體定義在頭文件linux/中:structkref{atomic_trefcount。}。其中唯一的字段是用來(lái)存放引用計(jì)數(shù)的原子變量。那為什么采用結(jié)構(gòu)體?這是為了便于進(jìn)行類型檢測(cè)。在使用kref前,必須先通過(guò)kref_init()函數(shù)來(lái)初始化它:void kref_init(struct kref *
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號(hào)-1