专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

深入分析Linux中断子系统之中断控制器及驱动

  说明:Kernel版本:4。14ARM64处理器,ContexA53,双核使用工具:SourceInsight3。5,Visio1。概述
  从这篇文章开始,来聊一聊中断子系统。中断是处理器用于异步处理外围设备请求的一种机制,可以说中断处理是操作系统管理外围设备的基石,此外系统调度、核间交互等都离不开中断,它的重要性不言而喻。
  来一张概要的分层图:
  硬件层:最下层为硬件连接层,对应的是具体的外设与SoC的物理连接,中断信号是从外设到中断控制器,由中断控制器统一管理,再路由到处理器上;硬件相关层:这个层包括两部分代码,一部分是架构相关的,比如ARM64处理器处理中断相关,另一部分是中断控制器的驱动代码;通用层:这部分也可以认为是框架层,是硬件无关层,这部分代码在所有硬件平台上是通用的;用户层:这部分也就是中断的使用者了,主要是各类设备驱动,通过中断相关接口来进行申请和注册,最终在外设触发中断时,进行相应的回调处理;
  中断子系统系列文章,会包括硬件相关、中断框架层、上半部与下半部、Softirq、Workqueue等机制的介绍,本文会先介绍硬件相关的原理及驱动,前戏结束,直奔主题。2。GIC硬件原理ARM公司提供了一个通用的中断控制器GIC(GenericInterruptController),GIC的版本包括V1V4,由于本人使用的SoC中的中断控制器是V2版本,本文将围绕GICV2来展开介绍;
  来一张功能版的框图:
  GICV2从功能上说,除了常用的中断使能、中断屏蔽、优先级管理等功能外,还支持安全扩展、虚拟化等;GICV2从组成上说,主要分为Distributor和CPUInterface两个模块,Distributor主要负责中断源的管理,包括优先级的处理,屏蔽、抢占等,并将最高优先级的中断分发给CPUInterface,CPUInterface主要用于连接处理器,与处理器进行交互;VirtualDistributor和VirtualCPUInterface都与虚拟化相关,本文不深入分析;
  再来一张细节图看看Distributor和CPUInterface的功能:
  GICV2支持三种类型的中断:SGI(softwaregeneratedinterrupts):软件产生的中断,主要用于核间交互,内核中的IPI:interprocessorinterrupts就是基于SGI,中断号ID0ID15用于SGI;PPI(PrivatePeripheralInterrupt):私有外设中断,每个CPU都有自己的私有中断,典型的应用有localtimer,中断号ID16ID31用于PPI;SPI(SharedPeripheralInterrupt):共享外设中断,中断产生后,可以分发到某一个CPU上,中断号ID32ID1019用于SPI,ID1020ID1023保留用于特殊用途;Distributor功能:全局开关控制Distributor分发到CPUInterface;打开或关闭每个中断;设置每个中断的优先级;设置每个中断将路由的CPU列表;设置每个外设中断的触发方式:电平触发、边缘触发;设置每个中断的Group:Group0或Group1,其中Group0用于安全中断,支持FIQ和IRQ,Group1用于非安全中断,只支持IRQ;将SGI中断分发到目标CPU上;每个中断的状态可见;提供软件机制来设置和清除外设中断的pending状态;CPUInterface功能:使能中断请求信号到CPU上;中断的确认;标识中断处理的完成;为处理器设置中断优先级掩码;设置处理器的中断抢占策略;确定处理器的最高优先级pending中断;
  中断处理的状态机如下图:
  Inactive:无中断状态;Pending:硬件或软件触发了中断,但尚未传递到目标CPU,在电平触发模式下,产生中断的同时保持pending状态;Active:发生了中断并将其传递给目标CPU,并且目标CPU可以处理该中断;Activeandpending:发生了中断并将其传递给目标CPU,同时发生了相同的中断并且该中断正在等待处理;
  GIC检测中断流程如下:GIC捕获中断信号,中断信号assert,标记为pending状态;Distributor确定好目标CPU后,将中断信号发送到目标CPU上,同时,对于每个CPU,Distributor会从pending信号中选择最高优先级中断发送至CPUInterface;CPUInterface来决定是否将中断信号发送至目标CPU;CPU完成中断处理后,发送一个完成信号EOI(EndofInterrupt)给GIC;
  更多linux内核视频教程文档资料免费领取后台私信【内核】自行获取。
  3。GIC驱动分析3。1设备信息添加
  ARM平台的设备信息,都是通过DeviceTree设备树来添加,设备树信息放置在archarm64bootdts下
  下图就是一个中断控制器的设备树信息:
  compatible字段:用于与具体的驱动来进行匹配,比如图片中arm,gic400,可以根据这个名字去匹配对应的驱动程序;interruptcells字段:用于指定编码一个中断源所需要的单元个数,这个值为3。比如在外设在设备树中添加中断信号时,通常能看到类似interrupts;的信息,第一个单元0,表示的是中断类型(1:PPI,0:SPI),第二个单元23表示的是中断号,第三个单元4表示的是中断触发的类型;reg字段:描述中断控制器的地址信息以及地址范围,比如图片中分别制定了GICDistributor(GICD)和GICCPUInterface(GICC)的地址信息;interruptcontroller字段:表示该设备是一个中断控制器,外设可以连接在该中断控制器上;关于设备数的各个字段含义,详细可以参考Documentationdevicetreebindings下的对应信息;
  设备树的信息,是怎么添加到系统中的呢?DeviceTree最终会编译成dtb文件,并通过Uboot传递给内核,在内核启动后会将dtb文件解析成devicenode结构。关于设备树的相关知识,本文先不展开,后续再找机会补充。来一张图,先简要介绍下关键路径:
  设备树的节点信息,最终会变成devicenode结构,在内存中维持一个树状结构;设备与驱动,会根据compatible字段进行匹配;3。2驱动流程分析
  GIC驱动的执行流程如下图所示:
  首先需要了解一下链接脚本vmlinux。lds,脚本中定义了一个irqchipoftable段,该段用于存放中断控制器信息,用于最终来匹配设备;在GIC驱动程序中,使用IRQCHIPDECLARE宏来声明结构信息,包括compatible字段和回调函数,该宏会将这个结构放置到irqchipoftable字段中;在内核启动初始化中断的函数中,ofirqinit函数会去查找设备节点信息,该函数的传入参数就是irqchipoftable段,由于IRQCHIPDECLARE已经将信息填充好了,ofirqinit函数会根据arm,gic400去查找对应的设备节点,并获取设备的信息。中断控制器也存在级联的情况,ofirqinit函数中也处理了这种情况;orirqinit函数中,最终会回调IRQCHIPDECLARE声明的回调函数,也就是gicofinit,而这个函数就是GIC驱动的初始化入口函数了;GIC的工作,本质上是由中断信号来驱动,因此驱动本身的工作就是完成各类信息的初始化,注册好相应的回调函数,以便能在信号到来之时去执行;setsmpprocesscall设置smpcrosscall函数指向gicraisesoftirq,本质上就是通过软件来触发GIC的SGI中断,用于核间交互;cpuhpsetupstatenocalls函数,设置好CPU进行热插拔时GIC的回调函数,以便在CPU热插拔时做相应处理;sethandleirq函数的设置很关键,它将全局函数指针handlearchirq指向了gichandleirq,而处理器在进入中断异常时,会跳转到handlearchirq执行,所以,可以认为它就是中断处理的入口函数了;驱动中完成了各类函数的注册,此外还完成了irqchip,irqdomain等结构体的初始化,这些结构在下文会进一步分析;最后,完成GIC硬件模块的初始化设置,以及电源管理相关的注册等工作;3。3数据结构分析
  先来张图:
  GIC驱动中,使用structgicchipdata结构体来描述GIC控制器的信息,整个驱动都是围绕着该结构体的初始化,驱动中将函数指针都初始化好,实际的工作是由中断信号触发,也就是在中断来临的时候去进行回调;structirqchip结构,描述的是中断控制器的底层操作函数集,这些函数集最终完成对控制器硬件的操作;structirqdomain结构,用于硬件中断号和LinuxIRQ中断号(virq,虚拟中断号)之间的映射;
  还是上一下具体的数据结构代码吧,关键注释如下:structirqchip{structdeviceparentdevice;指向父设备constcharname;procinterrupts中显示的名字unsignedint(irqstartup)(structirqdatadata);启动中断,如果设置成NULL,则默认为enablevoid(irqshutdown)(structirqdatadata);关闭中断,如果设置成NULL,则默认为disablevoid(irqenable)(structirqdatadata);中断使能,如果设置成NULL,则默认为chipunmaskvoid(irqdisable)(structirqdatadata);中断禁止void(irqack)(structirqdatadata);开始新的中断void(irqmask)(structirqdatadata);中断源屏蔽void(irqmaskack)(structirqdatadata);应答并屏蔽中断void(irqunmask)(structirqdatadata);解除中断屏蔽void(irqeoi)(structirqdatadata);中断处理结束后调用int(irqsetaffinity)(structirqdatadata,conststructcpumaskdest,boolforce);在SMP中设置CPU亲和力int(irqretrigger)(structirqdatadata);重新发送中断到CPUint(irqsettype)(structirqdatadata,unsignedintflowtype);设置中断触发类型int(irqsetwake)(structirqdatadata,unsignedinton);使能禁止电源管理中的唤醒功能void(irqbuslock)(structirqdatadata);慢速芯片总线上的锁void(irqbussyncunlock)(structirqdatadata);同步释放慢速总线芯片的锁void(irqcpuonline)(structirqdatadata);void(irqcpuoffline)(structirqdatadata);void(irqsuspend)(structirqdatadata);void(irqresume)(structirqdatadata);void(irqpmshutdown)(structirqdatadata);void(irqcalcmask)(structirqdatadata);void(irqprintchip)(structirqdatadata,structseqfilep);int(irqrequestresources)(structirqdatadata);void(irqreleaseresources)(structirqdatadata);void(irqcomposemsimsg)(structirqdatadata,structmsimsgmsg);void(irqwritemsimsg)(structirqdatadata,structmsimsgmsg);int(irqgetirqchipstate)(structirqdatadata,enumirqchipirqstatewhich,boolstate);int(irqsetirqchipstate)(structirqdatadata,enumirqchipirqstatewhich,boolstate);int(irqsetvcpuaffinity)(structirqdatadata,voidvcpuinfo);void(ipisendsingle)(structirqdatadata,unsignedintcpu);void(ipisendmask)(structirqdatadata,conststructcpumaskdest);unsignedlongflags;};structirqdomain{structlistheadlink;用于添加到全局链表irqdomainlist中constcharname;IRQdomain的名字conststructirqdomainopsops;IRQdomain映射操作函数集voidhostdata;在GIC驱动中,指向了irqgicdataunsignedintflags;unsignedintmapcount;映射中断的个数Optionaldatastructfwnodehandlefwnode;enumirqdomainbustokenbustoken;structirqdomainchipgenericgc;ifdefCONFIGIRQDOMAINHIERARCHYstructirqdomainparent;支持级联的话,指向父设备endififdefCONFIGGENERICIRQDEBUGFSstructdentrydebugfsfile;endifreversemapdata。Thelinearmapgetsappendedtotheirqdomainirqhwnumberthwirqmax;IRQdomain支持中断数量的最大值unsignedintrevmapdirectmaxirq;unsignedintrevmapsize;线性映射的大小structradixtreerootrevmaptree;RadixTree映射的根节点unsignedintlinearrevmap〔〕;线性映射用到的查找表};structirqdomainops{int(match)(structirqdomaind,structdevicenodenode,enumirqdomainbustokenbustoken);用于中断控制器设备与IRQdomain的匹配int(select)(structirqdomaind,structirqfwspecfwspec,enumirqdomainbustokenbustoken);int(map)(structirqdomaind,unsignedintvirq,irqhwnumberthw);用于硬件中断号与Linux中断号的映射void(unmap)(structirqdomaind,unsignedintvirq);int(xlate)(structirqdomaind,structdevicenodenode,constu32intspec,unsignedintintsize,unsignedlongouthwirq,unsignedintouttype);通过devicenode,解析硬件中断号和触发方式ifdefCONFIGIRQDOMAINHIERARCHYextendedV2interfacestosupporthierarchyirqdomainsint(alloc)(structirqdomaind,unsignedintvirq,unsignedintnrirqs,voidarg);void(free)(structirqdomaind,unsignedintvirq,unsignedintnrirqs);void(activate)(structirqdomaind,structirqdatairqdata);void(deactivate)(structirqdomaind,structirqdatairqdata);int(translate)(structirqdomaind,structirqfwspecfwspec,unsignedlongouthwirq,unsignedintouttype);endif};3。3。1IRQdomain
  IRQdomain用于将硬件的中断号,转换成Linux系统中的中断号(virtualirq,virq),来张图:
  每个中断控制器都对应一个IRQDomain;中断控制器驱动通过irqdomainadd()接口来创建IRQDomain;IRQDomain支持三种映射方式:linearmap(线性映射),treemap(树映射),nomap(不映射);linearmap:维护固定大小的表,索引是硬件中断号,如果硬件中断最大数量固定,并且数值不大,可以选择线性映射;treemap:硬件中断号可能很大,可以选择树映射;nomap:硬件中断号直接就是Linux的中断号;
  三种映射的方式如下图:
  图中描述了三个中断控制器,对应到三种不同的映射方式;各个控制器的硬件中断号可以一样,最终在Linux内核中映射的中断号是唯一的;4。Archspeicific代码分析中断也是异常模式的一种,当外设触发中断时,处理器会切换到特定的异常模式进行处理,而这部分代码都是架构相关的;ARM64的代码位于archarm64kernelentry。S。ARM64处理器有四个异常级别ExceptionLevel:03,EL0级对应用户态程序,EL1级对应操作系统内核态,EL2级对应Hypervisor,EL3级对应SecureMonitor;异常触发时,处理器进行切换,并且跳转到异常向量表开始执行,针对中断异常,最终会跳转到irqhandler中;
  代码比较简单,如下:Interrupthandling。。macroirqhandlerldrlx1,handlearchirqmovx0,spirqstackentryblrx1irqstackexit。endm
  来张图:
  中断触发,处理器去异常向量表找到对应的入口,比如EL0的中断跳转到el0irq处,EL1则跳转到el1irq处;在GIC驱动中,会调用sethandleirq接口来设置handlearchirq的函数指针,让它指向gichandleirq,因此中断触发的时候会跳转到gichandleirq处执行;gichandleirq函数处理时,分为两种情况,一种是外设触发的中断,硬件中断号在161020之间,一种是软件触发的中断,用于处理器之间的交互,硬件中断号在16以内;外设触发中断后,根据irqdomain去查找对应的LinuxIRQ中断号,进而得到中断描述符irqdesc,最终也就能调用到外设的中断处理函数了;
  首页内核技术中文网构建全国最权威的内核技术交流分享论坛
  转载地址:深入分析Linux中断子系统之中断控制器及驱动圈点内核技术中文网构建全国最权威的内核技术交流分享论坛

澳大利亚女篮主帅输给中国女篮很失望,错失很多轻松投篮的机会女篮世界杯半决赛,澳大利亚女篮以5961不敌中国女篮,赛后,澳大利亚女篮主帅桑迪布龙代洛接受了媒体采访,对于最终的结果,她感到非常失望,在她看来,球队错失了很多轻松投篮的机会,这最孕期要去胎毒吗?出现这几种皮肤痒时得小心,可能会要了胎儿的命钱江晚报小时新闻通讯员姜洁斯记者何丽娜前阵子,怀孕37周的李女士来到杭州市妇产科医院产科做产检,手里还拿着包中药,检查前便关切地问可以喝这个药去胎毒吗?胎毒真的存在吗?吃鹅蛋喝玉米时尚圈金九银十至,各大牌发布新品升级温暖型格时尚圈金九银十已至,又到了时尚行业最为活跃的时节,各大品牌竞相发售秋冬新款,款式琳琅满目,设计花样纷呈,希望为成都消费者带来新的选择。哪些才是引领潮流风向的选择,上身时什么样的造型理查德米勒的限量粉色陀飞轮,掺杂着极多的复杂工艺这款粉色陀飞轮是理查德米勒和巴巴沃森(英文名BubbaWatson美国职业高尔夫球运动员美国高尔夫大师赛冠军)共同开发的第三款陀飞轮机芯,也是该品牌的第四款BubbaWatson时nba新赛季即将到来,贝弗利能否给湖人带来本质改变,值得期待2022到23赛季的nba常规赛将于10月19日开赛。第一条就有紫金王朝湖人对卫冕冠军勇士队的比赛。nba第一人勒布朗詹姆斯直面总决赛mvp斯蒂芬库里,看看谁能带走胜利。勇士基本保朱珠一家三口露面!穿千元拖鞋拿21万包装行李,1岁女儿颜值似妈饿了吗?戳右边关注我们,每天给您送上最新出炉的娱乐硬核大餐!9月30日,据媒体报道,朱珠与老公王昀佳携女儿现身上海虹桥机场,一家三口罕见同框,引发网友热议。曝光的照片中,朱珠穿着条真正能优雅到老的女人,除了妆容要得体,高级耐看的发型才是关键在现实生活当中,大部分上了年纪的女人,对于自己的外在形象都不会特别看重,总觉得人老了之后就应该随波逐流,不化妆不打扮不精致,可实际上女人想要真正的优雅到老,就一定不能忽略了穿衣打扮SHANGXIA上下2023春夏系列中国美学的浪漫宣言SHANGXIA上下与生俱来的多元理念贯穿于2023春夏系列中简约风格与装饰细节结构性与流动感哑光与亮面色彩与留白在此交融共生。传承千年的工艺凝练为开创性的艺术表达,向新一代年轻群你们见过最脏的女生有多脏我哥带回来一个女朋友,长的眉目清秀,身材高挑,眼睛又大又圆,穿着打扮也很清爽时尚,但她在我家住了一个星期之后,我才发现,这不过表面,她可能是我到目前为止,见过最脏的女孩子!第一次看古代人如何爱美女子妆之美也。自古女为悦己者容。一日新妆抛旧样,六宫争画黑烟眉。由此可见在古时人们就对于化妆有了一定的涉及。朱砂我国最早的装饰颜料之一,其色润红,是女子妆红的用品。朱唇皓齿,嫭以姱祛眼袋有哪些方法,术后会有疤吗?专业医生告诉你随着咱们现在越来越注重保养,祛眼袋现在也是咱们经常会做的眼周年轻化手术,去祛眼袋之前呢,我们要先了解自己的是真性眼袋还是假性眼袋,这样才能选对适合自己的术士。眼袋手术有哪些?如果确
伦敦热浪之下,英国皇家卫兵苦不堪言帽子如同高压锅环球时报综合报道在伦敦的热浪之下,白金汉宫外身着厚重制服戴着熊皮帽的皇家卫兵们苦不堪言,他们直言束腰上衣和帽子就像高压锅。据英国每日邮报19日报道,当日英国大部分地区受到极端高温侵善弈者王栩在围棋世界,韩国职业棋手李昌镐是一个特殊而传奇的存在。他6岁学棋,9岁被韩国围棋皇帝曹薰铉收为内弟子,14岁那年从师父手中夺得韩国围棋最高位的头衔。自1992年夺得第一个世界冠军起王者混动利刃出击比亚迪唐DM8月25日,混动SUV比亚迪唐DMp正式上市,共推出三款车型,综合补贴后售价为28。98万32。98万元,同时带来2大无忧购车政策1大无忧用车保障等四重购车权益。此外,比亚迪唐DM是任正非错了?还是市场对了股市是个群羊聚集的地方会放大恐惧,也会放大泡沫市场很少会走中庸之道要么便宜到无人问津要么泡沫到猪都能飞上天02hr历史上任正非预判经济困难的时候,股市的大底就在不远处前两次任正非提水蛇真的不上岸吗?所见所得,都很科学在夏天最喜欢去沟里洗澡了,水冰凉冰凉的,洗澡非常舒服,只是很多时候都会有不速之客来打扰我们的雅兴,只要看到它基本都是光着屁股很快跑到岸上,等了走了在下水,我们这边血糖高了,看脚就知道?出现3种脚部变化,提醒你要及时降糖刘阿姨今年55岁,一直以来和王叔叔在农村以种地为生,省吃俭用供养了两个大学生。5年前在农村免费体检中查出血糖高,乡镇卫生院嘱咐刘阿姨去医院进行全面检查。但是刘阿姨担心花钱觉得没啥大初中7初中79年级语文475个常考成语总结,语文考试这些每次考试必考!语文的考试涵盖面非常的广泛,不仅仅考察我们的基础知识,还要考察我们对于文章的理解,以及写作的能力,所以想要学好语文并世锦赛国羽4胜3负!陈清晨贾一凡完胜丹麦名将,女单男双冷门频出2022年羽毛球世锦赛18决赛今天打响,国羽收获一波4胜3负的战绩,奥运冠军王懿律黄东萍以21162114完胜印尼重点培养的新秀里洼迪皮塔,这场比赛国羽两人赢得很轻松,在各个技术环进了婆家门,不入婆家眼的5位女星,个个面容姣好,境遇却大不同从古至今,婆媳关系都让很多人不知所措,而婆媳关系的好坏也或多或少影响着晚辈婚姻的长久,好像一把隐形的枷锁。普通人遇到的婆媳关系中的鸡零狗碎在女明星那里一样都不会少,她们甚至需要比普人民需要混动五菱首款混动日前,行车视线从官方渠道获悉,五菱星辰混动版车型于8月25日正式上市,新车共推出2。0LDHT电劲款2。0LDHT电速款这2款车型,指导售价分别为9。98万和10。98万元。同时还司马懿有一种聪明,叫示弱转载来源洞见(IDDJ00123987)三国演义描写了四百多个人物,大抵是足智多谋,或孔武有力的奇人。谁也料想不到,这样一个群英荟萃的三国乱世,最终却归于司马一家。公元249年,司
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网