范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

深入分析Linux中断子系统之通用框架处理

  说明:Kernel版本:4.14 ARM64处理器,Contex-A53,双核 使用工具:Source Insight 3.5, Visio 1. 概述
  深入分析Linux中断子系统之中断控制器及驱动讲到了底层硬件GIC驱动,以及Arch-Specific的中断代码,本文将研究下通用的中断处理的过程,属于硬件无关层。当然,我还是建议你看一下上篇文章。
  这篇文章会解答两个问题: 用户是怎么使用中断的( 中断注册 )?外设触发中断信号时,最终是怎么调用到中断handler的( 中断处理 )?2. 数据结构分析
  先来看一下总的数据结构,核心是围绕着 struct irq_desc 来展开:
  Linux内核的中断处理,围绕着中断描述符结构 struct irq_desc 展开,内核提供了两种中断描述符组织形式:打开 CONFIG_SPARSE_IRQ 宏(中断编号不连续),中断描述符以radix-tree 来组织,用户在初始化时进行动态分配,然后再插入radix-tree 中;关闭 CONFIG_SPARSE_IRQ 宏(中断编号连续),中断描述符以数组的形式组织,并且已经分配好;不管哪种形式,都可以通过 linux irq 号来找到对应的中断描述符;图的左侧灰色部分,主要在中断控制器驱动中进行初始化设置,包括各个结构中函数指针的指向等,其中 struct irq_chip 用于对中断控制器的硬件操作,struct irq_domain 与中断控制器对应,完成的工作是硬件中断号到Linux irq 的映射;图的上侧灰色部分,中断描述符的创建(这里指 CONFIG_SPARSE_IRQ ),主要在获取设备中断信息的过程中完成的,从而让设备树中的中断能与具体的中断描述符irq_desc 匹配;图中剩余部分,在设备申请注册中断的过程中进行设置,比如 struct irqaction 中handler 的设置,这个用于指向我们设备驱动程序中的中断处理函数了;
  中断的处理主要有以下几个功能模块: 硬件中断号到 Linux irq 中断号的映射,并创建好irq_desc 中断描述符;中断注册时,先获取设备的中断号,根据中断号找到对应的 irq_desc ,并将设备的中断处理函数添加到irq_desc 中;设备触发中断信号时,根据硬件中断号得到 Linux irq 中断号,找到对应的irq_desc ,最终调用到设备的中断处理函数;
  上述的描述比较简单,更详细的过程,往下看吧。
  更多linux内核视频教程文档资料免费领取后台私信【内核】自行获取.
  3. 流程分析3.1 中断注册
  这一次,让我们以问题的方式来展开:先来让我们回答第一个问题:用户是怎么使用中断的? 熟悉设备驱动的同学应该都清楚,经常会在驱动程序中调用 request_irq() 接口或者request_threaded_irq() 接口来注册设备的中断处理函数;request_irq()/request_threaded_irq 接口中,都需要用到irq ,也就是中断号,那么这个中断号是从哪里来的呢?它是Linux irq ,它又是如何映射到具体的硬件设备的中断号的呢?
  先来看第二个问题:设备硬件中断号到 Linux irq 中断号的映射
  硬件设备的中断信息都在设备树 device tree 中进行了描述,在系统启动过程中,这些信息都已经加载到内存中并得到了解析;驱动中通常会使用 platform_get_irq 或irq_of_parse_and_map 接口,去根据设备树的信息去创建映射关系(硬件中断号到linux irq 中断号映射);深入分析Linux中断子系统之中断控制器及驱动提到过struct irq_domain 用于完成映射工作,因此在irq_create_fwspec_mapping 接口中,会先去找到匹配的irq domain ,再去回调该irq domain 中的函数集,通常irq domain 都是在中断控制器驱动中初始化的,以ARM GICv2 为例,最终回调到gic_irq_domain_hierarchy_ops 中的函数;如果已经创建好了映射,那么可以直接进行返回 linux irq 中断号了,否则的话需要irq_domain_alloc_irqs 来创建映射关系;irq_domain_alloc_irqs 完成两个工作:针对 linux irq 中断号创建一个irq_desc 中断描述符;调用 domain->ops->alloc 函数来完成映射,在ARM GICv2 驱动中对应gic_irq_domain_alloc 函数,这个函数很关键,所以下文介绍一下;
  gic_irq_domain_alloc 函数如下:
  gic_irq_domain_translate :负责解析出设备树中描述的中断号和中断触发类型(边缘触发、电平触发等);gic_irq_domain_map :将硬件中断号和linux中断号绑定到一个结构中,也就完成了映射,此外还绑定了irq_desc 结构中的其他字段,最重要的是设置了irq_desc->handle_irq 的函数指针,这个最终是中断响应时往上执行的入口,这个是关键,下文讲述中断处理过程时还会提到;根据硬件中断号的范围设置 irq_desc->handle_irq 的指针,共享中断入口为handle_fasteoi_irq ,私有中断入口为handle_percpu_devid_irq ;
  上述函数执行完成后,完成了两大工作: 硬件中断号与Linux中断号完成映射,并为Linux中断号创建了 irq_desc 中断描述符;数据结构的绑定及初始化,关键的地方是设置了中断处理往上执行的入口;
  再看第一个问题:中断是怎么来注册的?
  设备驱动中,获取到了 irq 中断号后,通常就会采用request_irq/request_threaded_irq 来注册中断,其中request_irq 用于注册普通处理的中断,request_threaded_irq 用于注册线程化处理的中断;
  在讲具体的注册流程前,先看一下主要的中断标志位: #define IRQF_SHARED		0x00000080              //多个设备共享一个中断号,需要外设硬件支持 #define IRQF_PROBE_SHARED	0x00000100              //中断处理程序允许sharing mismatch发生 #define __IRQF_TIMER		0x00000200               //时钟中断 #define IRQF_PERCPU		0x00000400               //属于特定CPU的中断 #define IRQF_NOBALANCING	0x00000800               //禁止在CPU之间进行中断均衡处理 #define IRQF_IRQPOLL		0x00001000              //中断被用作轮训 #define IRQF_ONESHOT		0x00002000              //一次性触发的中断,不能嵌套,1)在硬件中断处理完成后才能打开中断;2)在中断线程化中保持关闭状态,直到该中断源上的所有thread_fn函数都执行完 #define IRQF_NO_SUSPEND		0x00004000      //系统休眠唤醒操作中,不关闭该中断 #define IRQF_FORCE_RESUME	0x00008000              //系统唤醒过程中必须强制打开该中断 #define IRQF_NO_THREAD		0x00010000      //禁止中断线程化 #define IRQF_EARLY_RESUME	0x00020000      //系统唤醒过程中在syscore阶段resume,而不用等到设备resume阶段 #define IRQF_COND_SUSPEND	0x00040000      //与NO_SUSPEND的用户共享中断时,执行本设备的中断处理函数
  request_irq 也是调用request_threaded_irq ,只是在传参的时候,线程处理函数thread_fn 函数设置成NULL;由于在硬件中断号和Linux中断号完成映射后, irq_desc 已经创建好,可以通过irq_to_desc 接口去获取对应的irq_desc ;创建 irqaction ,并初始化该结构体中的各个字段,其中包括传入的中断处理函数赋值给对应的字段;__setup_irq 用于完成中断的相关设置,包括中断线程化的处理:中断线程化用于减少系统关中断的时间,增强系统的实时性; ARM64默认开启了 CONFIG_IRQ_FORCED_THREADING ,引导参数传入threadirqs 时,则除了IRQF_NO_THREAD 外的中断,其他的都将强制线程化处理;中断线程化会为每个中断都创建一个内核线程,如果中断进行共享,对应 irqaction 将连接成链表,每个irqaction 都有thread_mask 位图字段,当所有共享中断都处理完成后才能unmask 中断,解除中断屏蔽;3.2 中断处理
  当完成中断的注册后,所有结构的组织关系都已经建立好,剩下的工作就是当信号来临时,进行中断的处理工作。
  来回顾一下深入分析Linux中断子系统之中断控制器及驱动 中的Arch-specific 处理流程:
  中断收到之后,首先会跳转到异常向量表的入口处,进而逐级进行回调处理,最终调用到 generic_handle_irq 来进行中断处理。
  generic_handle_irq 处理如下图:
  generic_handle_irq 函数最终会调用到desc->handle_irq() ,这个也就是对应到上文中在建立映射关系的过程中,调用irq_domain_set_info 函数,设置好了函数指针,也就是handle_fasteoi_irq 和handle_percpu_devid_irq ;handle_fasteoi_irq :处理共享中断,并且遍历irqaction 链表,逐个调用action->handler() 函数,这个函数正是设备驱动程序调用request_irq/request_threaded_irq 接口注册的中断处理函数,此外如果中断线程化处理的话,还会调用__irq_wake_thread() 唤醒内核线程;handle_percpu_devid_irq :处理per-CPU中断处理,在这个过程中会分别调用中断控制器的处理函数进行硬件操作,该函数调用action->handler() 来进行中断处理;
  来看看中断线程化处理后的唤醒流程吧 __handle_irq_event_percpu->__irq_wake_thread :
  __handle_irq_event_percpu->__irq_wake_thread 将唤醒irq_thread 中断内核线程;irq_thread 内核线程,将根据是否为强制中断线程化对函数指针handler_fn 进行初始化,以便后续进行调用;irq_thread 内核线程将while(!irq_wait_for_interrupt) 循环进行中断的处理,当满足条件时,执行handler_fn ,在该函数中最终调用action->thread_fn ,也就是完成了中断的处理;irq_wait_for_interrupt 函数,将会判断中断线程的唤醒条件,如果满足了,则将当前任务设置成TASK_RUNNING 状态,并返回0,这样就能执行中断的处理,否则就调用schedule() 进行调度,让出CPU,并将任务设置成TASK_INTERRUPTIBLE 可中断睡眠状态;3.3 总结
  中断的处理,总体来说可以分为两部分来看: 从上到下:围绕 irq_desc 中断描述符建立好连接关系,这个过程就包括:中断源信息的解析(设备树),硬件中断号到Linux中断号的映射关系、irq_desc 结构的分配及初始化(内部各个结构的组织关系)、中断的注册(填充irq_desc 结构,包括handler处理函数)等,总而言之,就是完成静态关系创建,为中断处理做好准备;从下到上,当外设触发中断信号时,中断控制器接收到信号并发送到处理器,此时处理器进行异常模式切换,并逐步从处理器架构相关代码逐级回调。如果涉及到中断线程化,则还需要进行中断内核线程的唤醒操作,最终完成中断处理函数的执行。
  首页 - 内核技术中文网 - 构建全国最权威的内核技术交流分享论坛
  转载地址:深入分析Linux中断子系统之通用框架处理 - 圈点 - 内核技术中文网 - 构建全国最权威的内核技术交流分享论坛

别人给你钱,你得大方的要而不是说什么给钱做什么别人给你钱,你得大方的要。而不是说什么给钱做什么。给钱就要,无论是夫妻还是什么,又或者是朋友,对方愿意给你钱,那就证明对方认可你这个人是有价值的,不给你钱,才是认为你这个人是没有价射阳河的神韵远离城市的喧嚣,寻一片净土,掬一方碧水,让梦想在蓝天白云下任意舒展。终于,在这疫情波动后的秋日,我如愿以偿地随梦的足迹,独自一人走进了离别多年故乡的射阳河。深秋,射阳河像天空一条云假期如约而至,慢饮一杯秋意茶点击关注华茶会学茶是一种使命!无由持一碗,寄与爱茶人。宁静致远,方得始终,我是林方致。不知不觉,又是一年国庆,假期伴随着节日的喜悦,秋意也随之接踵而来,后疫情时代,阻碍了旅游的计划大道至简,衍化至繁一切都是最简单的,经过衍化后变得复杂。人生的路是自己选择的,有简单的,也有复杂的,不管哪一条路都充满荆棘和波折,历经千辛万苦,终会踏上属于自己的那一条路。万事万物,都有它的规律,都有一种爱,刻骨铭心,一生难忘文安冬悦01。hr听过这样一句话往往联系方式删得越是彻底的人,对那段过往就越难忘,看似很决绝潇洒,其实心里难受得要死。大概很多人都是这样,在结束一段感情后,用删除联系方式的形式来与心存思念,爱在心间头条创作挑战赛你是天空中的一朵云温暖的春风把你吹来吹到了我的身旁从此住扎我心底心如美丽花儿绽放燕儿双双飞彩蝶翩翩舞美好时光长相随秋声像悠长呜咽的鸟啼单调忧伤划破了我的心你走了迎着那美团之所以敢无底线无下限对待商家和骑手原因就四个字不缺人干美团之所以敢把商家的提点一而再再而三的提高,无底线的增加名目繁多的苛捐杂税,把骑手的单价一降再降,福利待遇全部取消,甚至于和骑手解除了劳动合同关系,原因无非就是不缺人干而已!经过几世界杯亚军!很有必要再一次介绍中国女篮姑娘们中国女篮介绍中国女篮是中国三大球中第二个拿到冠军奖杯的队伍,斩获亚运会亚锦赛冠军,世锦赛奥运会银牌,世界杯亚军诸多好成绩,世界排名长期保持在世界前八,亚洲第一。2022年9月16日效率0!女排遭逆转最大罪人曝光,主帅蔡斌连伤2人引发质疑女排世锦赛小组赛最后一轮,中国女排在先赢一局的情况下连丢三局,从而以13惨遭巴西女排逆转,尤其后面三局比赛输的没有任何反抗之力。虽然仍旧以小组第一身份晋级第二阶段,可球队这样的竞技曼联被灌6球引热议C罗不用背锅,哈兰德会比姆巴佩先拿金球吗北京时间10月2日晚21点,英超第9轮的一场比赛展开争夺,曼联做客挑战曼城。曼联新赛季前两场比赛都落败,只让滕哈格不得不改变了自己的思路,让球队踢得更加务实,球队从第3轮开始回到正63,曼联耻辱一战,领先5球,瓜迪奥拉泄洪式换下4名首发北京时间今天2100,英超第九轮迎来焦点战,第188场曼市德比,曼城坐阵伊蒂哈德球场迎战曼联。最终,凭借着哈兰德和福登的两个帽子戏法,曼城毫无悬念在主场63拿下曼联,取得德比战重要
人老了,如果老伴儿不在了,请主动依靠这3个人人这一生,活着就会经历生离死别,人老了以后,身边亲近的人,总是在一个个减少,尤其是老伴儿的离世,更是让自己俗常的生活,平添了很多凄凉和孤独夫妻的缘分已到尽头,一个人先走,另一个人,我的家乡大马峪西董街道办事处驻地西南约9公里处,有个四面环山藏在幽深谷底的小小村落大马峪。这里属鹤伴山西麓,植被丰茂,清幽秀美。三三两两的房屋依山而建,一条小溪自南面的山间蜿蜒而下,绕村北去。溯英格兰世界杯大名单英格兰要把世界杯带回家11月10日,英格兰国家足球队官方公布了2022卡塔尔世界杯的26人大名单,英格兰队的球迷都希望这次英格兰能弥补2020欧洲杯的遗憾,把大赛奖杯带回家。这份名单中,加雷斯索斯盖特以八部门新规14处提及露营,今年露营旅游热度再涨北京日报客户端记者潘福达近日,体育总局发展改革委文旅部等八部门联合制定的户外运动产业发展规划(20222025年)正式发布,其中共有14处提及露营,明确提出优化露营产品供给,鼓励开文华东方宣布位于科威特的崭新豪华酒店项目科威特文华东方酒店文华东方酒店集团宣布将管理位于科威特的一间豪华酒店,项目预计将于2028年开业。酒店坐落于科威特市金融区的核心地带,势将为这座城市带来奢华与优雅的全新典范。科威特这76个型号新能源车将可减免车船税或免征购置税又有一批新车可以减免车船税购置税啦!工信部发布享受车船税减免优惠的节约能源使用新能源汽车车型目录(第四十四批)免征车辆购置税的新能源汽车车型目录(第六十批)。其中,减免车船税涉节能喊一声嘿!GitHub,说出需求VSCode就能自己写代码了明敏发自凹非寺量子位公众号QbitAI喊一句嘿!GitHub,说出你的需求,代码自动来!Python中导入pandas库,只需说一句importpandas长句语音一连串命令,都不双十一种草了些什么?小米首款骨传导耳机绝对是米粉的福音大家好,我是爱读书的masterjohn话说一年一度的双十一已经在悄无声息的情况下来临了,我也是悄无声息的趁着老婆大人不知道,买了这款小米的最新最热辣的第一代骨传导耳机,准备做一盘双11走向强韧性数字技术应变多峰叠加本报记者李晖北京报道第十四个双11落下帷幕。在稳经济的大背景下,这一年度消费大节正在告别对交易数字和破纪录的追逐,在见证消费韧性的同时,更强化在服务价值和技术超越上立目标。中国经营苹果公司高管团队一览苹果公司(AppleInc。)是美国高科技公司。其2021年度的营收达到3658亿美元。北京时间2022年1月4日凌晨2点45分左右,美国科技巨头苹果的股价达到了182。88美元,如何批量查询快递,并按快递公司筛选单号当你拥有多个快递单号的时候,会怎么快速查询物流,并按快递公司筛选需要的单号呢?不知道如何操作的宝贝们,下面请随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎