细说Linux内核中断架构

linux内核学习10:中断和异常 一、中断 1.1 中断的概念 中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的 CPU 暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。Linux中通常分为外部中断(又叫硬件中断)和内部中断(又叫异常)。 软件对硬件进行配置后,软件期望等待硬件的某种状态(比如,收到了数据),这里有两种方式, 轮询(polling): CPU 不断的去读硬件状态。 中断:当硬件完成某种事件后,给 CPU 一个中断,让 CPU 阅读详情

中断和异常

一、什么是中断?

        中断通常被定义为一个事件,该事件改变处理器执行的指令顺序。这样的事件与CPU芯片内外部硬件电路产生的电信号相对应。

        中断通常分为同步中断和异步中断:

2  同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断。

        ◎ 异步中断是由其他硬件设备依照CPU时钟信号随机产生的。

        在Intel微处理器手册中:

        ◎ 把同步中断称为异常(exception)

        ◎ 把异步中断称为中断(interrupt)

        这两类中断的共同特点是什么?如果CPU当前不处于核心态,则发起从用户态到核心态的切换。接下来,在内核中执行一个专门的例程,称为中断服务例程(interrupt service routine)。或中断处理程序(interrupthandler)

        另一方面,异常是由程序的错误产生的,或者是由内核必须处理的异常条件产生的。第一种情况下,内核通过发送一个每个Unix/Linux程序员都熟悉的信号来处理异常。第二种情况下,内核执行恢复异常需要的所有步骤,例如缺页异常等。

二、中断信号的作用

        中断信号提供了一种特殊的方式,使处理器转而去运行正常控制流之外的代码。当一个中断信号达到时,CPU必须停止它当前正在做的事情,并且切换到一个新的活动。为了这做到这一点,就要在内核态堆栈保存程序计数器的当前值(即EIP和CS寄存器的内容),并把与中断类型相关的一个地址放进程序计数器。

        这可能会让我们想起系统调度的进程切换,发生在内核用一个进程替换另一个进程时。但是中断处理与进程切换有一个明显的差异:由中断或异常处理程序执行的代码不是一个进程。更准确的说,它是一个内核控制路径,代表中断发生时正在运行的进程执行。作为一个内核控制路径,中断处理程序比一个进程要“轻”(中断的上下文很少,建立或终止中断处理需要的时间也很少)

        中断处理是由内核执行的最敏感的任务之一,因为它必须满足下列约束:

        ◎ 当内核正打算去完成一些别的事情时,中断随时会到来。因此,内核的目标就是让中断尽可能快地处理完,尽其所能把更多的处理向后推迟。因此,内核响应中断后需要进行的操作分为两部分:关键而紧急的部分,内核立即执行;其余推迟的部分,内核随后执行。

        ◎ 因为中断随时会到来,所以内核可能正在处理其中的一个中断时,另一个不同类型的中断又发生了。内核应该尽可能地允许这种情况发生,因为这能维持更多的I/O设备得到处理的机会。因此,中断处理程序必须编写成使相应的内核控制路径能以嵌套的方式执行。当最后一个内核控制路径终止时,内核必须能恢复被中断进程的执行,或者,如果中断信号已导致了重新调度,内核也应能切换到另外的进程。

        ◎ 尽管内核在处理前一个中断时可以接受一个新的中断,但在内核代码中还是存在一些临界区,在临界区中,中断必须被禁止。必须尽可能地限制这样的临界区,因为根据以前的要求,内核,尤其是中断处理程序,应该在大部分时间内以开中断的方式运行。

三、IRQ和中断

        中断这个名词使用得并不是很谨慎,为什么?由于中断是用来表示由CPU和外部硬件发出的信号所产生的。但是中断不能由处理器外部的外设直接产生,而必须借助于一个称为可编程中断控制器(programmable interrupt controller)的标准组件来请求,该组件存在于每个系统中。

        外部设备,会有电路连接到用于向中断控制器发送中断请求的组件。控制器在执行了各种电工任务之后,将中断请求转发到CPU的中断输入中。因为外部设备不能直接发出中断,而必须通过中断控制器的标准组件来请求中断,所以这种请求更正确的叫法是IRQ,或中断请求(Interrupt Request)。

每个能够发出中断请求的硬件设备控制器都有这么一条名为IRQ的输出线。所有现有的IRQ线都会与这个中断控制器(PIC)的硬件电路的输入引脚相连。下面来看看这种中断控制器执行下列动作:

        1)    监视IRQ线,检查产生的信号 。如果有一条或两条以上的IRQ线上产生信号,就选择引脚编号较小的IRQ线。

        2)    如果一个引发信号出现在IRQ线上:

                a)    把接收到的引发信号转换成对应的向量(索引)。

                b)    把这个向量存放在中断控器的一个I/O端口,从而允许CPU通过数据总线读取此向量。

                c)    把引发信号发送到处理器的INTR引脚,即产生一个中断。

                d)    等待,直到CPU通过把这个中断信号写进可编程中断控制器的一个I/O端口来确认它;当这种情况发生时,清INTR线。

        3)    返回到第一步。

        IRQ线是从0开始顺序编号的,因此,第一条IRQ线通常表示成IRQ0。与IRQn关联的Intel缺省向量是n+32。如前所述,通过向中断控制器端口发布合适的指令,就可以修改IRQ和向量之间的映射。

        可以有选择地禁止每条IRQ线。因此,可以对PIC编程从而禁止IRQ,也就是说,可以告诉PIC停止对给定的IRQ线发布中断,或者激活它们,禁止的中断是丢失不了的,它们一旦激活,PIC就又把它们发送到CPU。这个特点被大多数中断处理程序使用,因为这允许中断处理程序逐次地处理同一类型的IRQ。

(一)处理中断

        在CPU得知发生中断后,它将进一步的处理委托给一个软件例程,该例程可能会修复故障、提供专门的处理或将外部事件通知用户进程。由于每个中断和异常都有唯一的编号,内核使用一个数组项是指向处理程序函数的指针。相关的中断号根据数组项在数组中位置判断。

        如下图所示:


1、进入和退出任务

        如下图,中断处理划分为3部分。首先,必须建立一个适当的环境,使得处理程序函数能够在其中执行,接下来调用处理程序自身,最后将系统复原到中断之前的状态。调用中断处理程序前后的两部分,分别称为进入路径和退出路径。

        进入和退出任务还负责确保处理器从用户态切换到核心态。进入路径的一个关键任务是,从用户态栈切换到核心态栈。但是这一点还不够。因为内核还要使用CPU资源执行其代码,进入路径必须保存用户应用程序当前的寄存器,以便 在中断活动结束后恢复。这与进程调度间用上下文切换的机制是相同的。在进入核心态时,只保存整个寄存器集合的一部分。内核并不使用全部寄存器。(如内核代码中不使用浮点操作,因而不保存浮点寄存器)。平台相关的数据结构pt_regs列出了核心态可能修改的所有寄存器,它的定义考虑到了不同的CPU之间的差别。

        在退出路径中,内核会检查下列事项。

        ◎  调度器是否应该选择一个新进程代替旧的进程。

        ◎  是否有信号必须投递到原进程

        从中断返回之后,只有确认了这两个问题,内核才能完成其常规任务,即还原寄存器集合、切换到用户态栈、切换到适用于用户应用程序的适当的处理器状态,或切换到一个不同的保护环。

        术语中断处理程序的使用可能引起岐义。因为它是用于指代CPU对ISR(中断服务程序)的调用,包括了进入/退出路径和ISR本身。当然,如果只指代在进入路径和退出路径之间进行由C语言实现的例程,将更为准确。

2、数据结构

        中断技术上的实现有两方面:

        1)    汇编语言代码:与处理器高度相关,用于处理特定平台上相关的底层细节;

        2)    抽象接口:是设备驱动程序及其他内核代码安装和管理IRQ处理程序所需的。

        描述汇编语言部分的功能会涉及无数细节,可以参考处理器体系方面的手册。

        为响应外部设备的IRQ,内核必须为每个潜在的IRQ提供一个函数。该函数必须能够动态注册和注销。静态表组织方式是不够的,因为可能为设备编写模块,而且设备可能与系统的其他部分通过中断进行交互。

        IRQ相关信息管理的关键点是一个全局数组,每个数组项对应一个IRQ编号。因为数组位置和中断号是相同的,很容易定位与特定的IRQ相关的数组项:IRQ0在位置0,IRQ15在位置15,等等,IRQ最终映射到哪个处理器中断,在这里不相关的。

        尽管各个数组项使用的是一个体系结构无关的数据类型,但IRQ的最大可能数目是通过一个平台相关的常数NR_IRQS指定的,大多数体系结构一,该常数定义在处理器相关的头文件irq.h中。不同处理器间及同一处理器家庭内,该常数的值变化都很大,主要取决于辅助CPU管理IRQ的辅助芯片。

        与IRQ的最大数目相比,我们对各数组项的数据类型更感兴趣。在了解细节之前,需要概述内核的IRQ处理子系统。

        之前的一些版本包含了大量平台代码来处理IRQ,在许多地方是相同的。因而,在内核版本2.6开发期间,引入了一个新的通用的IRQ

Linux 的中断 文章目录中断概念和分类Linux 中断处理程序架构Linux 中断编程申请和释放中断使能和屏蔽中断底半部机制1. tasklet2.工作队列3.软中断4. threaded irq 中断概念和分类 中断是指 CPU 在执行程序的过程中,出现了某些突发事件急待处理, CPU 必须暂停当前程序的执行,转去处理突发事件,处理完毕后又返回原程序被中断的位置继续执行。 根据中断的来源,中断可分为内部中断和外部中断,内部中断的中断源来自 CPU 内部(软件中断指令、溢出、除法错误等,例如,操作系统从用户态切换到内核态 阅读详情

相关推荐

Linux内核中断

Linux内核中断ARM里当按下按键的时候,他首先会执行汇编文件start.s里面的异常向量表里面的irq在irq里面进行一些操作。再跳转到C的do_irq();进行操作:1)判断中断的序号;2)处理中断;3)清除中断;Linux内核实现和ARM裸机实现中断的原理是一样的。

m0_74937538的博客 1494

深度解析Linux内核—中断

为了把每个中断控制器本地的硬件中断映射到全局唯一的Linux中断号(也称为虚拟中断),内核定义了中断域irq_domain,每个中断控制器由自己的中断域。在GIC v2控制器的驱动程序中,定义了多个类型为of_device_id的静态变量,成员compatible是驱动程序支持的设备的名称,成员data是初始化函数,编译器把这些静态变量放在专用的节“__irqchip_of_table”里面。如果返回IRQ_WAKE_THREAD,说明是线程化的中断,那么唤醒中断处理线程。

m0_74282605的博客 1290

Linux内核中断下半部机制之软中断

Linux内核中断常见的下半部机制

wojiaxiaohuang2014的博客 663

【C语言】linux内核软中断

内核中的软中断(Softirqs)和任务下半部(Tasklets)是Linux内核中用于在中断上下文之外处理中断服务的一种底层机制。这些机制解决了不能在中断服务例程(ISR)中执行耗时操作或者需要睡眠的操作的问题。软中断提供了一种在中断上下文中延迟处理的方法,允许中断处理分为两个阶段:顶半部和底半部。

数字人生 1395

set_irq_affinity

通过把sudo service irqbalance stop; 然后执行该脚本 使用方法: /sbin/set_irq_affinity eth1 可以进行中断绑定指定的cpu,提高网卡收包效率 把下面“eth1” 修改成对应的网卡名称 irq=$(cat /proc/interrupts | grep eth1 | cut -d':' -f 1); echo $irq for i in $irq ; do sudo cat /proc/irq/$i/smp_affinity_list ; done 查看绑定后的效果

深入博通PEX89000内部:那颗ARM CPU和Synthetic Mode到底能玩出什么花样?

本文深入解析博通PEX89000系列PCIe交换芯片内置的ARM CPU与Synthetic Mode技术,揭示其在AI计算和数据中心的智能潜能。通过ARM Cortex CPU的实时控制和Synthetic Mode的自治网络功能,PEX89000实现了GPU集群的动态拓扑重组和资源池化,大幅提升AI训练效率。文章还探讨了该技术在软件定义数据平面和弹性AI架构中的创新应用。

weixin_30776273的博客 209

从仿真到实战:PMOS缓启动与栅极泄放电路的优化设计

本文深入探讨了PMOS缓启动与栅极泄放电路的优化设计,通过立创EDA仿真和实物调试,解决了关断速度慢和耐压问题。文章详细介绍了电路改进方案和低功耗优化技巧,为工程师提供了实用的工程实践建议,帮助提升电源开关电路的性能和可靠性。

weixin_28721917的博客 258

绕过Google Play:获取Expo Go安卓APK的实用指南

本文为国内安卓开发者提供了绕过Google Play商店获取Expo Go APK的实用指南。针对无法访问Google Play的痛点,详细介绍了通过官方GitHub Releases、可信第三方网站(如APKMirror)及APK下载器等多种安全获取途径,并重点讲解了APK安装、安全验证(核对签名)及常见连接问题的排查方法,帮助开发者顺利开启React Native开发之旅。

weixin_29006701的博客 577

51单片机基础知识

前言 周末闲着无聊,以后定时更新一期关于51单片机的学习案例,以供大家平时参考使用。至于单片机,你可以理解为人的大脑,而人各项身体器官的运作需要意识给到大脑,然后大脑再驱动我们的中枢神经进行相应的动作,这里的意识可以理解为我们要写的程序,而人的器官相当于各种输出设备,例如我们以后要学的LED、电机、各种传感器等等。学好单片机能让你找到一份相对不错的工作,当然越可观的东西也是要付出相应努力的。 一、51单片机是什么? 通常我们一说到 51 单片机,指的都是兼容IntelMCS-51体系架构的一系列单片机,而

qq_43537819的博客 6903

顶刊论文引言用AI怎么写?借助Gemini 3 Pro结合四段式写出逻辑清晰的Introduction

写研究目标时,先明确研究问题,直接回应前文提到的研究缺口,如 “This study aims to investigate whether X modulates Y via the Z pathway in human cells.”然后再提出你的研究假设,当理论依据清晰时,可以用如 “We hypothesized that inhibiting X would rescue Y deficiency in this model.”的句子点出研究目标。要求:1)明确陈述本研究拟解决的核心科学问题;

智能AI让学术科研更容易 180

利用XGBoost实现短期电力负荷预测

本数据集为某地区2009年-2015年的用电负荷,时间片为每分钟这里我们定义了XGB模型作为实例,来进行模型训练,之后我们会对其使用网格搜索找到最优的参数。

优快云 精品推荐 4494

魔改短线利器DPO指标,频繁交易也能盈利超30倍?手机同花顺可用!

昨天我们提示了一些高位风险板块,今天来看基本上都在跌幅前列。这一波由AIGC驱动的大行情,短期来看可能已经到了尾声。中期大家可以关注30日线和60日线是否有支撑,这种现象级的生产力变革主导的行情不可能直接就凉了——哪怕相关的企业距离从中获利还很遥远。在A股,当前是否盈利并不是当前股价的主要矛盾。保守的同学不妨关注下昨天的机会列表,里边全是一些超跌的板块,短期可能会延续弱势,但是一旦站上20日线,可能就会有一波超跌反弹的行情。AIGC中的资金外流,大概率会有一些低位板块得到临幸。

量化祛魅师 老Q。 1万+

【用ArcGIS制作一张好看的中国月度气温图

要最后选中那个事先调整好的那个数据框,这样其他两个数据框才能和其大小一致。

J_Giser的博客 1017

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 备份3
下一篇: 备份5
品茶识书香
博客等级 码龄17年 34粉丝 10原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值