




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
為啥要驅動模型隨著系統結構演化越來越復雜,Linux內核對設備描述衍生出一般性的抽象描述,形成一個分層體系結構,從而引入了設備驅動模型。這樣描述還是不夠讓人理解,來看一下這些需求就好理解些:Linux內核可以在各種體系結構和硬件平臺上運行,因此需要最大限度地提高代碼在平臺之間的可重用性。?分層實現也實現了軟件工程的高內聚-低耦合的設計思想。低耦合體現在對外提供統一的抽象訪問接口,高內聚將相關度緊密的集中抽象實現。Linux內核驅動程序模型是先前在內核中使用的所有不同驅動程序模型的統一。它旨在通過將一組數據和操作整合到全局可訪問的數據結構中,來擴展基于基礎總線來橋接設備驅動程序。傳統的驅動模型為它們所控制的設備實現了某種類似于樹的結構(有時只是一個列表)。不同類型的總線之間沒有任何一致性。驅動模型抽象了啥當前驅動程序模型為描述總線和總線下可能出現的設備提供了一個通用的、統一的模型。統一總線模型包括一組所有總線都具有的公共屬性和一組公共回調,如總線探測期間的設備發現、總線關閉、總線電源管理等。通用的設備和橋接接口反映了現代計算機的目標:即執行無縫設備“即插即用”,電源管理和熱插拔的能力。特別是,英特爾和微軟規定的模型(即ACPI)可確保與x86兼容的系統上幾乎任何總線上的幾乎所有設備都可以在此范式下工作。當然,雖然大多數總線都支持其中大多數操作,但并不是每條總線都能夠支持所有此類操作。那么哪些通用需求被抽象出來了呢??電源系統和系統關機,對于電源管理與系統關機對于設備相關的操作進行抽象實現。關機為什么要被抽象出來管理,比如設備操作正在進行此時系統收到關機指令,那么在設備模型層就會遍歷系統設備硬件,確保系統正確關機。?用戶空間訪問:sysfs虛擬文件系統實現與設備模型對外的訪問抽象,這也是為什么說Linux設備也是文件的由來。實際從軟件架構層面看,這其實是一個軟件橋接模塊,抽象出統一用戶訪問接口,橋接了設備驅動。?熱插拔管理:熱插拔管理機制定義統一的抽象接口操作符kset_hotplug_ops,不同設備利用操作符實現差異化。?設備類型:設備分類機制,從高層級抽象描述設備類型,具體可以在sysfs下面體現。用戶空間訪問由于具有系統中所有設備的完整分層視圖,因此將完整的分層視圖導出到用戶空間變得相對容易。這是通過實現名為sysfs虛擬文件系統來完成的。sysfs的自動掛載通常是通過/etc/fstab文件中的以下條目來完成的:none/syssysfsdefaults00對于Debian系統而言,可能在/lib/init/fstab采用下面的形式掛載:none/syssysfsnodev,noexec,nosuid00當然也可以采用手動方式掛載:#mount-tsysfssysfs/sys當將設備插入樹中時,都會為其創建一個目錄。該目錄可以填充在發現的每個層(全局層,總線層或設備層)中。全局層當前創建兩個文件-'name'和’power'。前者報告設備名稱。后者報告設備的當前電源狀態。它還將用于設置當前電源狀態。總線層為探測總線時發現的設備創建文件。例如,PCI層當前為每個PCI設備創建“irq"和“resource"文件。特定于設備的驅動程序也可以在其目錄中導出文件,以暴露特定于設備的數據或可用接口。驅動模型實現先來梳理一下內部幾個主要與驅動模型相關的數據結構:./include/linux/Device.h定義設備驅動主要數據結構bus_type:抽象描述總線類型,如USB/PCI/I2C/MMC等device_driver:實現具體連接在總線上的設備驅動。device:描述連接在總線上的設備./include/linux/Kobject.h中定義了隱藏在后臺的類似于基類的數據結構:kset:可以認為是kobject的頂層容器類。每個kset內部都包含了自己的kobject.kobject:在sysfs中出現的每個對象都對應一個kobject,它和內核交互來創建它的可見表述,每一個kobject對應文件系統/sys里的一個目錄,目錄的名字就是結構體中的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內核對釦-<ss>wrm?_grom,Qmmyj內核對釦-<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刨附jWd.u削剌19朝11unsijrH-5irrtHRa.nwnon^.aavcn^.Nrt1uns?j-*dimuFiencauop^ss1:”h.R-RuM《人2刃Stsru脫kl廠(hKlsQ■丿]設備IDBpriooj孫「汨」o(k(|冋“」刪£1.設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總線盹總線上根設備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用以驅動總線,具體的驅動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;}?注冊適配器驅動程序(USB控制器,I2C適配器等),以檢測連接的設備,并提供與設備的通信機制?圖中的match函數接口用于將驅動程序與設備進行匹配。match回調的目的是使總線有機會通過比較驅動程序支持的設備ID與特定設備的設備ID來確定特定驅動程序是否支持特定設備,而不會犧牲特定于總線的功能或類型安全性。當向總線注冊驅動程序時,將遍歷總線的設備列表,并為每個沒有與之關聯的驅動程序的設備調用match回調。?提供API函數以實現適配器驅動以及設備驅動。?同時dev_pm_ops*pm實現對于總線的功耗管理接口抽象。對于特定總線實現這個操作符對應的函數。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/設備屬性dev_groups/驅動屬性drv_(*restore_noirq)(structdevice*dev);int(*runtime_suspend)(structdevice*dev);int(*runtime_resume)(structdevice*dev);int(*runtime_idle)(structdevice*dev);};?iommu_ops操作符提供總線相關的IOMMU抽象。?設備驅動注冊到總線上時,將在sysfs管理總線/設備/設備驅動的層次關系,以PCI為例:/*在總線上注冊的驅動程序會在總線的驅動程序目錄中獲得一個目錄*//sys/bus/pci/I--devicesdriversI--IntelICHI--IntelICHJoystickI--agpgart'--elOO/*在該類型的總線上發現的每個設備都會在總線的設備目錄中獲得到物理層次結構中該設備目錄的符號鏈接*//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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司銀行本票管理制度
- 售票崗位風險管理制度
- 別墅現場裝修管理制度
- 開發與測試的協同工作模式探討試題及答案
- 醫院推行電腦管理制度
- 廠區裝修現場管理制度
- 學校教室規章管理制度
- 醫院職工假期管理制度
- 公司禮品贈送管理制度
- 沖床加工車間管理制度
- MOOC 金融學-湖南大學 中國大學慕課答案
- 第五單元 單元作業設計 小學語文部編版三年級下冊
- 成人氧氣吸入療法-中華護理學會團體標準
- 納米銀概念和作用課件
- 建筑業企業資質標準-建市2014159號(文本版)
- 《肩關節功能解剖》課件
- 項目管理-基層科普行動計劃項目解析
- 施工人材機配置方案3
- 急性淋巴結炎的護理查房
- 籃球三步上籃體育
- NB-T 47013.7-2012(JB-T 4730.7) 4730.7 承壓設備無損檢測 第7部分:目視檢測
評論
0/150
提交評論