版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
為啥要驅(qū)動模型隨著系統(tǒng)結(jié)構(gòu)演化越來越復(fù)雜,Linux內(nèi)核對設(shè)備描述衍生出一般性的抽象描述,形成一個分層體系結(jié)構(gòu),從而引入了設(shè)備驅(qū)動模型。這樣描述還是不夠讓人理解,來看一下這些需求就好理解些:Linux內(nèi)核可以在各種體系結(jié)構(gòu)和硬件平臺上運行,因此需要最大限度地提高代碼在平臺之間的可重用性。?分層實現(xiàn)也實現(xiàn)了軟件工程的高內(nèi)聚-低耦合的設(shè)計思想。低耦合體現(xiàn)在對外提供統(tǒng)一的抽象訪問接口,高內(nèi)聚將相關(guān)度緊密的集中抽象實現(xiàn)。Linux內(nèi)核驅(qū)動程序模型是先前在內(nèi)核中使用的所有不同驅(qū)動程序模型的統(tǒng)一。它旨在通過將一組數(shù)據(jù)和操作整合到全局可訪問的數(shù)據(jù)結(jié)構(gòu)中,來擴展基于基礎(chǔ)總線來橋接設(shè)備驅(qū)動程序。傳統(tǒng)的驅(qū)動模型為它們所控制的設(shè)備實現(xiàn)了某種類似于樹的結(jié)構(gòu)(有時只是一個列表)。不同類型的總線之間沒有任何一致性。驅(qū)動模型抽象了啥當(dāng)前驅(qū)動程序模型為描述總線和總線下可能出現(xiàn)的設(shè)備提供了一個通用的、統(tǒng)一的模型。統(tǒng)一總線模型包括一組所有總線都具有的公共屬性和一組公共回調(diào),如總線探測期間的設(shè)備發(fā)現(xiàn)、總線關(guān)閉、總線電源管理等。通用的設(shè)備和橋接接口反映了現(xiàn)代計算機的目標(biāo):即執(zhí)行無縫設(shè)備“即插即用”,電源管理和熱插拔的能力。特別是,英特爾和微軟規(guī)定的模型(即ACPI)可確保與x86兼容的系統(tǒng)上幾乎任何總線上的幾乎所有設(shè)備都可以在此范式下工作。當(dāng)然,雖然大多數(shù)總線都支持其中大多數(shù)操作,但并不是每條總線都能夠支持所有此類操作。那么哪些通用需求被抽象出來了呢??電源系統(tǒng)和系統(tǒng)關(guān)機,對于電源管理與系統(tǒng)關(guān)機對于設(shè)備相關(guān)的操作進行抽象實現(xiàn)。關(guān)機為什么要被抽象出來管理,比如設(shè)備操作正在進行此時系統(tǒng)收到關(guān)機指令,那么在設(shè)備模型層就會遍歷系統(tǒng)設(shè)備硬件,確保系統(tǒng)正確關(guān)機。?用戶空間訪問:sysfs虛擬文件系統(tǒng)實現(xiàn)與設(shè)備模型對外的訪問抽象,這也是為什么說Linux設(shè)備也是文件的由來。實際從軟件架構(gòu)層面看,這其實是一個軟件橋接模塊,抽象出統(tǒng)一用戶訪問接口,橋接了設(shè)備驅(qū)動。?熱插拔管理:熱插拔管理機制定義統(tǒng)一的抽象接口操作符kset_hotplug_ops,不同設(shè)備利用操作符實現(xiàn)差異化。?設(shè)備類型:設(shè)備分類機制,從高層級抽象描述設(shè)備類型,具體可以在sysfs下面體現(xiàn)。用戶空間訪問由于具有系統(tǒng)中所有設(shè)備的完整分層視圖,因此將完整的分層視圖導(dǎo)出到用戶空間變得相對容易。這是通過實現(xiàn)名為sysfs虛擬文件系統(tǒng)來完成的。sysfs的自動掛載通常是通過/etc/fstab文件中的以下條目來完成的:none/syssysfsdefaults00對于Debian系統(tǒng)而言,可能在/lib/init/fstab采用下面的形式掛載:none/syssysfsnodev,noexec,nosuid00當(dāng)然也可以采用手動方式掛載:#mount-tsysfssysfs/sys當(dāng)將設(shè)備插入樹中時,都會為其創(chuàng)建一個目錄。該目錄可以填充在發(fā)現(xiàn)的每個層(全局層,總線層或設(shè)備層)中。全局層當(dāng)前創(chuàng)建兩個文件-'name'和’power'。前者報告設(shè)備名稱。后者報告設(shè)備的當(dāng)前電源狀態(tài)。它還將用于設(shè)置當(dāng)前電源狀態(tài)??偩€層為探測總線時發(fā)現(xiàn)的設(shè)備創(chuàng)建文件。例如,PCI層當(dāng)前為每個PCI設(shè)備創(chuàng)建“irq"和“resource"文件。特定于設(shè)備的驅(qū)動程序也可以在其目錄中導(dǎo)出文件,以暴露特定于設(shè)備的數(shù)據(jù)或可用接口。驅(qū)動模型實現(xiàn)先來梳理一下內(nèi)部幾個主要與驅(qū)動模型相關(guān)的數(shù)據(jù)結(jié)構(gòu):./include/linux/Device.h定義設(shè)備驅(qū)動主要數(shù)據(jù)結(jié)構(gòu)bus_type:抽象描述總線類型,如USB/PCI/I2C/MMC等device_driver:實現(xiàn)具體連接在總線上的設(shè)備驅(qū)動。device:描述連接在總線上的設(shè)備./include/linux/Kobject.h中定義了隱藏在后臺的類似于基類的數(shù)據(jù)結(jié)構(gòu):kset:可以認為是kobject的頂層容器類。每個kset內(nèi)部都包含了自己的kobject.kobject:在sysfs中出現(xiàn)的每個對象都對應(yīng)一個kobject,它和內(nèi)核交互來創(chuàng)建它的可見表述,每一個kobject對應(yīng)文件系統(tǒng)/sys里的一個目錄,目錄的名字就是結(jié)構(gòu)體中的namedcwicoI怕吸rantlw<hiWvcldcwicoI怕吸rantlw<hiWvcl啊承0_亦Mv,mwtjumcrjihiwn:hs???L?*neJ*Yconstcnrvamesag血—怖小".ssrur!rw如0,ewne?:“fwl.Hb????■?:ii1r;【?「"u54■dfrna.mask:????■?:ii1r;【?「"u54■dfrna.mask:Pdmau6<con^enLcmi.miw.b64nsjJMS.mawrdnu」wur:nunsisneilErgijnwj)fn_of5etsirucinsi.hfiMdma.paoteromgipaQi&Cfdma)3i9i*r林初46卩9_0化C€CU^E_J>MERE町戸.?;.:ifi?tn/j?i;.<,,?<Blfuctbni^cotieten^rnmPrw.moE?We?CWirXi.O^.CMABiruclcm*xnu.orsa.rDH*r;?unG<i.-rondfsvud<w^rthamaimui.struct^ncejiodo*cf.nadc;r?訊『山厲料f??*iBlrutthwcdeJWKJto叫BD%戶li!*1門,H.Q*1尸刖乃F■琴叫E£/K力EV1g8OM"y(XXL2tn?nj^nP?4?M?eROC^.W?,-Jj-2忑coraiiatiud叫心Hxa」d*述nMtchJabte.€Qn>isuuctaqiLdME」ap【pLmm<n」aM?^r^ooeiinmi^<e?o曲;qSS7?hfSli£]?frtHfifnoielHtrurtdwue'd^ei?Lx6JJLU<rJwarjnu>w*n>(4truaa餉c*?"氓iuruiKwaCcaruciaaikc-a??.曲』皿押」s.w<?4Wconr^a^mJ>ou9Aoroup8.zond'stjuctatnhuie^prou;.^如-嚴叩.]BtnxtCMS.tfpo?g,;「.dV?"XF?vun??icejuiMi^rr?■十■妙ivr己紳.0?:為-i■2?p?fcrnn.gm廠m:匕化vmPrMLg廠?cMMKaevKJEaWgeLGgd■?臨10沱5”0尸艮旳巳LZFHGsirunniu?xmuiMr先吊枝出閘號口fttsorr^inJiiHnir?r/airh?svuct<tev?pmjniDpowrsvuu供v」frukrT4ie*n-d?m?ncond^liud*pm;駆刼胭性vadrcortijunr)Corveldeme?阿5ructMQ_(ro(nainfihjjoiti■他fMef<>OMfi!G_PrK;IRLconstcnar<ian)e?crv<1r*vMMe*ownet.consiitnjctalrftjule.g!oup?wafCOOirjGW陽皿*』"們?,?R弄&?T取加‘憑nmr?wafCOOirjGW陽皿*』"們?,?R弄&?T取加‘憑nmrLab].H紗UEIRJ費dv/ee^er.■huiumlutUji啊?emi.charrtuutdnu?Pev,unnQdcjTiifldoi;樺dftlWLFlwrtl"⑷W鈿wo「aeojdwXstiKlcz"?卻Hrj.hdMVywnj)re}!?VuetJ^iw?啊corsisbuctLoi'i_ns.tipjoDeut?mF&.3?卩嘰constg*d?^natrjesp^ce'JbVurideMce?deo.wt4CgrLcwnrtnhpwnrvdW"?■^r.fcuKLCM^.?g?J90mnarfMaf3U化GGNERO:.MSURO?TDMAM內(nèi)核對釦-<ss>wrm?_grom,Qmmyj內(nèi)核對釦-<ss>wrm?_grom,Qmmyjiqvp.EVuct.cfrrmi_ftiM|j?c*lDmrriu_l?PK;structicrrmu^pMhn?lcinwiwjsarjmIOMMUeomtxtiarname;BWlK”?l/WZ0y.戲wdinbi祈林slwUseHcBetsbucl.ab^p^Mrpr.stiucti?mrs,noclr*s<3;rs/indrtttofisntrvUMi吹“燉E乂MW<Cai『Q_OE9U0-旳6疋兀RELEASEBhuttB2vedjAvnrckiM^:fcntffun£g>3imsia)=jnnaicQd1TOC\o"1-5"\h\zuns>yv€-5irrtstate1;unaiywint刨附j(luò)Wd.u削剌19朝11unsijrH-5irrtHRa.nwnon^.aavcn^.Nrt1uns?j-*dimuFiencauop^ss1:”h.R-RuM《人2刃Stsru脫kl廠(hKlsQ■丿]設(shè)備IDBpriooj孫「汨」o(k(|冋“」刪£1.設(shè)rouii°審9<.戶aptwoio<oufacaifcooiortinw^d^ablfd*?toolonine?i.too>oLr?&d?af?u**di.ftticln?d(GQ^FIG>R<;H.W5_SYfKJ3f*V:GR_D6VlCg?11?u&ffldiea-FiO-APCH.kAS.svNe.oww-FOR.cPui屮U?1nSa〔CGfFg_AfKK.fSYHCJ^_ER-CFU/MItooldma.e^MrHei:“noripinl?K_tnst.Me*:structkob|ectKot?jcon?fituctmjcrt^ua^fiL^pt"e呱鄧wasl4hai?dei^nsme.Studd吹d*5?4'JMtHriMdn^Ue_tfiOul-"—."叩tatWIWLXHJ?rtvCA_fllOU(lf、」KJUD9:unstjugjtrgQjggp-如匚強匕車BlrudBiitir/sjfn^e*p.?*iKt哄xq"”i^ckjsyt?ooi"GljwnijOKk總線盹總線上根設(shè)備Wiwmaich^X?*?ucidokeaefc<.sinxld?nic?.dN??r■而it!?!]?-??TOB*ru:l?XKe*d**.Rixlk(xiLjM5nur*'?".円ft?忖ITHMJSIds比&曲tnfrarra^Kurucldc?)raPW.riliuH-urOKtfuttde\ie??dw|.rtroniin^xwrfnawMce丄ai"血1阿"皿伽“g)抽眾SL逢琛作trfirsusp&ntOistiucldwWd^rpin^matsaga.tstahlrefra5utnc>;rrozta?Mca■*?r?rmim_<iisuu(\iwmw*ow).reiMma^rarrtpTM畑ad**dndbus_typebus_type用以驅(qū)動總線,具體的驅(qū)動USB/I2C/PCI/MMC等:注冊總線,利用bus_register注冊總線,bus_unregister刪除總線。如下例子,每種總線須定義一個bus_type對象,并利用bus_register注冊總線,或bus_unregister刪除總線。/*i2c-core-base.c*/structbus_typei2c_bus_type={.name="i2c",.match=i2c_device_match,.probe=i2c_device_probe,.remove=i2c_device_remove,.shutdown=i2c_device_shutdown,};EXPORT_SYMBOL_GPL(i2c_bus_type);staticint__initi2c_init(void){intretval;retval=of_alias_get_highest_id("i2c");down_write(&__i2c_board_lock);if(retval>=__i2c_first_dynamic_bus_num)__i2c_first_dynamic_bus_num=retval+1;up_write(&__i2c_board_lock);/*注冊I2C總線*/retval=bus_register(&i2c_bus_type);訐(retval)returnretval;is_registered=true;#ifdefCONFIG_I2C_COMPATi2c_adapter_compat_class=class_compat_register("i2c-adapter");if(!i2c_adapter_compat_class){retval=-ENOMEM;gotobus_err;}#endifretval=i2c_add_driver(&dummy_driver);訐(retval)gotoclass_err;訐(IS_ENABLED(CONFIG_OF_DYNAMIC))WARN_ON(of_reconfig_notifier_register(&i2c_of_notifier));訐(IS_ENABLED(CONFIG_ACPI))WARN_ON(acpi_reconfig_notifier_register(&i2c_acpi_notifieR));return0;class_err:#ifdefCONFIG_I2C_COMPATclass_compat_unregister(i2c_adapter_compat_class);bus_err:#endifis_registered=false;/*錯誤時刪除總線*/bus_unregister(&i2c_bus_type);returnretval;}?注冊適配器驅(qū)動程序(USB控制器,I2C適配器等),以檢測連接的設(shè)備,并提供與設(shè)備的通信機制?圖中的match函數(shù)接口用于將驅(qū)動程序與設(shè)備進行匹配。match回調(diào)的目的是使總線有機會通過比較驅(qū)動程序支持的設(shè)備ID與特定設(shè)備的設(shè)備ID來確定特定驅(qū)動程序是否支持特定設(shè)備,而不會犧牲特定于總線的功能或類型安全性。當(dāng)向總線注冊驅(qū)動程序時,將遍歷總線的設(shè)備列表,并為每個沒有與之關(guān)聯(lián)的驅(qū)動程序的設(shè)備調(diào)用match回調(diào)。?提供API函數(shù)以實現(xiàn)適配器驅(qū)動以及設(shè)備驅(qū)動。?同時dev_pm_ops*pm實現(xiàn)對于總線的功耗管理接口抽象。對于特定總線實現(xiàn)這個操作符對應(yīng)的函數(shù)。structdev_pm_ops{int(*prepare)(structdevice*dev);void(*complete)(structdevice*dev);int(*suspend)(structdevice*dev);int(*resume)(structdevice*dev);int(*freeze)(structdevice*dev);int(*thaw)(structdevice*dev);int(*poweroff)(structdevice*dev);int(*restore)(structdevice*dev);int(*suspend_late)(structdevice*dev);int(*resume_early)(structdevice*dev);int(*freeze_late)(structdevice*dev);int(*thaw_early)(structdevice*dev);int(*poweroff_late)(structdevice*dev);int(*restore_early)(structdevice*dev);int(*suspend_noirq)(structdevice*dev);int(*resume_noirq)(structdevice*dev);int(*freeze_noirq)(structdevice*dev);int(總線屬性:bus_groups/總線屬性:bus_groups/設(shè)備屬性dev_groups/驅(qū)動屬性drv_(*restore_noirq)(structdevice*dev);int(*runtime_suspend)(structdevice*dev);int(*runtime_resume)(structdevice*dev);int(*runtime_idle)(structdevice*dev);};?iommu_ops操作符提供總線相關(guān)的IOMMU抽象。?設(shè)備驅(qū)動注冊到總線上時,將在sysfs管理總線/設(shè)備/設(shè)備驅(qū)動的層次關(guān)系,以PCI為例:/*在總線上注冊的驅(qū)動程序會在總線的驅(qū)動程序目錄中獲得一個目錄*//sys/bus/pci/I--devicesdriversI--IntelICHI--IntelICHJoystickI--agpgart'--elOO/*在該類型的總線上發(fā)現(xiàn)的每個設(shè)備都會在總線的設(shè)備目錄中獲得到物理層次結(jié)構(gòu)中該設(shè)備目錄的符號鏈接*//sys/bus/pci/I--devicesII--00:00.0->../../../root/pci0/00:00.0II--00:01.0->../../../root/pci0/00:01.0I'--00:02.0->../../../root/pci0/00:02.0--driversbln_3ltribuEa?3trUGt?definedInncludW1Inux^yafs.hslrjctaunbuteanr,sizejsze:(_?^oid^pcivate
ssize^t(*readi(slnjelfile*■,strucrkobjectt
siiucthin_aittribuie*.char\垃£_|);ssize_1structfile\gfrucskobjeci!",sttucttun^attribuie*上h時s^ejj;a1tribLirt?_graijp?islruGl?difln^dIn.Ancluda/Hnux/sysfs.hcons:char"naTie.urTode_lt*is_Msbfea1tribLirt?_graijp?islruGl?difln^dIn.Ancluda/Hnux/sysfs.hcons:char"naTie.urTode_lt*is_Msbfe)(sfructkobjerth.structattn-bLJle\inti:urrodejii£_bin__visibl£)(structkob?clstructbin_attribute*ai;n|jsirjctannts(j[e"AatEr5strjcttinattrlbLteBBtinailrs.atEribiitB?strLtcl?dafinodin>./ineludo/lanucqn5uchar^naTts;.urTodc_imodc;wilderGON^IG^DEBUG^LOCK^ALLOCbosfcgnor^崗即gtrjcttack__class_k&'ii*k^structtock_class_kevsk?y;constchar'namecon^tch@ir'd^nanre.sfrud:d€vfci@令因_「<xrt;cnnfitsfrudiatfri!tul&_gr&u{3i^bdej^roups:1coTkStsiruttamtuld^gr^upi'"dav^groupt,—匚口rrstwtn^tattitute^grwji?^drvjgrotsps,sirudsubsysjmaee口strud:lock_c.las!s_k^ylock-keyz
boolneed_parenl_bck;rrtrmatctijistnjctdevice*dav.structdevi£€!_driver*ch<i;■nt4*ue?nrtKEtrucldevice'rav.Eiruclk-DbLuevEnnt^BflvaBnV|£nt{*probe)(structdewce"devj,rttfremoveiisiinjctcfe^ce*de/i.沁td■"shuidc^n)|slnL0:tdevice*d&v).ntl*antineMs-trLirtdexicsfcdevj;nt{*offin&)istuctdevice*dev|;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度企業(yè)員工借用設(shè)備使用期限合同3篇
- 2025年度定制家具行業(yè)競業(yè)禁止模板木方買賣合同3篇
- 2025年度農(nóng)村自建房合同協(xié)議書(含智能安防監(jiān)控)
- 養(yǎng)殖場土地租賃合同(二零二五年度)農(nóng)業(yè)科技創(chuàng)新3篇
- 二零二五年度個人施工安全責(zé)任協(xié)議書范本3篇
- 2025年度農(nóng)村自建房工程承包合同
- 2025年度全新官方版二零二五年度離婚協(xié)議書與房產(chǎn)分割執(zhí)行細則3篇
- 二零二五年度特色農(nóng)業(yè)農(nóng)田承包合作協(xié)議
- 2025年度出租車位充電樁安裝工程驗收及質(zhì)保合同
- 二零二五年度全新寫字樓轉(zhuǎn)租協(xié)議合同:商務(wù)樓租賃權(quán)轉(zhuǎn)讓專案2篇
- 增服葉酸預(yù)防神經(jīng)管缺陷理論知識考核試題及答案
- 新業(yè)娛樂安全評價報告
- 醫(yī)保工作自查表
- 調(diào)休單、加班申請單
- 小學(xué)-英語-湘少版-01-Unit1-What-does-she-look-like課件
- 單證管理崗工作總結(jié)與計劃
- 安全安全隱患整改通知單及回復(fù)
- 國有檢驗檢測機構(gòu)員工激勵模式探索
- 采購部年終總結(jié)計劃PPT模板
- CDI-EM60系列變頻調(diào)速器使用說明書
- 【匯總】高二政治選擇性必修三(統(tǒng)編版) 重點知識點匯總
評論
0/150
提交評論