版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
为啥要驱动模型随着系统结构演化越来越复杂,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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 脊髓疾病护理的未来发展趋势
- 心理慰藉志愿者服务协议书2026
- 垂直整合行业标准合作协议
- 会议设备租赁合同2026年度
- 2026年精益生产视角下的厂内物流改善
- 2026年如何处理团队中的“刺头”员工
- 2026社会及治理投资合作协议2026年
- 2026年初中生物后进生转化工作心得体会
- 线上医疗健康波特五力评估合同
- 咖啡机销售及售后服务合同
- 从“智人”到“数字人”
- DB11T 3032-2022 水利工程建设质量检测管理规范
- 媒体创意经济:玩转互联网时代学习通超星期末考试答案章节答案2024年
- 工程造价咨询服务投标方案(技术方案)
- GB/T 44299-2024探测器探测范围的测量方法和声明用于大和小运动探测的被动式红外探测器
- 《交通监控系统》课件
- 27.2.2相似三角形的性质教学设计人教版九年级数学下册
- GSTGM9000图形显示装置软件用户手册
- 明管结构计算书(Excel)
- 2023年同等学力申硕经济学综合历年真题及答案
- 《社会工作实务》初级社会工作师
评论
0/150
提交评论