深入剖析linux中断机制,深入剖析Linux中断机制

深入分析Linux中断机制-深入分析Linux中断机制-中断概述-中断概述[摘要]本文详细介绍了Linux内核的中断实现机制。本文首先介绍了中断的一些基本概念,然后分析了面向对象的Linux中断的组织形式、三种主要数据结构及其相互关系。然后介绍了在Linux中处理异常和中断的基本过程。在此基础上,分析了中断处理的详细过程,包括保存场景、中断处理、中断退出时的软中断执行和中断返回时的进程切换等问题。最后,介绍了中断相关的应用编程接口,包括中断注册和释放、中断关闭和使能、如何写中断中断中断、共享中断、中断上下文中断状态等。[关键词]中断,异常,hw_interrupt_type,irq_desc_t,irqaction,asm_do_IRQ,软中断,进程切换,中断注册释放请求_IRQ,free_irq,共享中断,可重入,中断上下文1中断概述1.1为什么我需要中断?处理器的速度通常与外围硬件设备的速度不在同一数量级。因此,如果内核采取让处理器向硬件发送请求然后等待响应的方法,显然是不令人满意的。由于硬件的响应非常慢,内核应该在此期间处理其他事务,并在硬件实际完成请求的操作后返回处理。轮询可能是这个问题的解决方案。内核可以定期查询设备的状态,然后进行相应的处理。然而,这种方法可能会让内核做很多无用的工作,因为无论硬件设备是在忙着完成任务还是已经完成了任务,轮询总是会周期性地重复。对我们来说,一个更好的方法是提供一种机制,让硬件在需要时向内核发送信号(将内核从活动状态更改为硬件活动状态)。这是中断机制。1.2中断的表达硬件设备在产生中断时不考虑与处理器时钟同步——换句话说,中断可以在任何时候产生。因此,内核可能会因为新的中断而在任何时候被中断。从物理角度来看,中断是由硬件设备产生的电信号,并直接发送到中断控制器的输入引脚。然后中断控制器向处理器发送相应的信号。一旦处理器检测到这个信号,它就中断当前的工作来处理这个中断。之后,处理器将通知操作系统已经产生了中断,以便操作系统能够正确地处理该中断。不同的设备对应不同的中断,每个中断由一个唯一的数字标识。因此,来自键盘的中断不同于来自硬盘的中断,因此操作系统可以区分该中断并知道哪个硬件设备产生了哪个中断。这样,操作系统可以为不同的中断提供不同的中断处理程序。这些中断值通常被称为中断请求(IRQ)线。通常IRQ是一些数字量。例如,在个人电脑上,IRQ0是一个时钟中断,IRQ 1是一个键盘中断。但是并不是所有的中断号都被如此严格地定义。例如,对于连接到PCI总线的设备,中断是动态分配的。然而,在嵌入式系统中,由于中断线路的数量有限,一般的外设和中断是一一匹配的,很少有动态分配的中断。然而,关键是特定的中断总是与特定的设备相关联,内核需要知道这些信息。1.3异常在操作系统中,我们在讨论中断时不能不提异常。广义地说,中断可分为同步中断和异步中断:同步中断是由执行指令时的中央处理器控制单元产生的。它们被称为同步的,因为中央处理器只会在命令执行后发出中断,而不是在代码指令执行期间,例如系统调用。异步中断:指其它硬件设备根据中央处理器时钟信号随机产生的中断,这意味着在指令之间可能发生中断,如键盘中断。

通常,处理器本身产生的同步中断称为异常,异步中断称为中断。中断可分为可屏蔽中断和不可屏蔽中断。异常可以分为三种类型:故障、陷阱和中止。表1:中断类别及其行为类别的原因异步/同步返回行为来自输入/输出设备的信号异步的中断总是返回到下一个指令陷阱。有意的异常同步总是返回到下一个指令失败。潜在的可恢复错误同步返回到当前指令终止。当处理器由于编程错误而执行错误指令(例如被0除)时,或者当在执行期间出现特殊情况(例如丢失页面)并且必须由内核处理时,不可恢复的错误同步不会返回到处理器,处理器将生成异常。因为许多处理程序体系结构以类似于中断的方式处理异常,所以内核以类似的方式处理它们。通过软中断实现系统调用就是捕获内核,然后导致一个特殊的异常——系统调用处理程序异常。您将看到中断以类似的方式工作,不同之处在于中断是由硬件而不是软件引起的。1.4当一个中断处理程序响应一个特定的中断时,内核执行一个被称为中断处理程序或中断服务例程的函数。每个产生中断的设备都有相应的中断处理程序。在Linux中,中断处理程序看起来像一个普通的C函数。然而,这些函数必须根据特定的类型来声明,以便内核能够以标准的方式传递处理程序的信息。中断处理程序和其他内核函数的真正区别在于,中断处理程序是由内核调用来响应中断的,它们运行在一个特殊的环境中,我们称之为中断环境。中断可以随时发生,因此中断处理程序可以随时执行。因此,有必要确保中断处理程序能够快速执行,从而确保中断代码的执行能够尽快恢复。因此,尽管硬件快速服务中断非常重要,但系统的其他部分让中断处理程序在尽可能短的时间内运行也同样重要。即使是最简单的中断服务程序也会与硬件交互,告诉设备已经收到中断。我们可以考虑网络设备中断处理程序面临的挑战。除了响应硬件之外,处理器还将网络数据包从硬件复制到内存,对其进行处理,然后将其发送到适当的协议栈或应用程序。显然,这种工作负载不会太小,尤其是对于今天的千兆和万兆以太网卡。因此,我们通常将中断处理分成两部分。中断处理程序是上半部分——它在接收到中断时立即开始执行,但只在严格的时间限制下工作,例如响应接收到的中断或重置硬件,所有这些都在所有中断被禁止时完成。可以稍后完成的工作将被推到下半部分。之后,在正确的时间,下半部分将被切断。以网卡为例,当网卡收到流入网络的数据包时,需要通知内核数据包已经到达。网卡需要立即完成此任务,从而优化网络的吞吐量和传输周期,以避免超时。因此,网卡立即发出中断:内核,我这里有最新的数据包。内核通过执行网卡的注册中断处理程序来响应。中断开始执行,应答硬件,将最新的网络数据包复制到内存,然后从网卡读取更多的数据包。这些都是重要、紧急且与硬件相关的任务。处理和操作数据包的其他工作在下半部分进行。

深入分析Linux中断机制2-Linux中断组织形式深入分析Linux中断机制2-Linux中断组织形式[摘要]本文详细介绍了Linux内核中断实现机制。本文首先介绍了中断的一些基本概念,然后分析了面向对象的Linux中断的组织形式、三种主要数据结构及其相互关系。然后介绍了在Linux中处理异常和中断的基本过程。在此基础上,分析了中断处理的详细过程,包括保存场景、中断处理、中断退出时的软中断执行和中断返回时的进程切换等问题。最后,介绍了中断相关的应用编程接口,包括中断注册和释放、中断关闭和使能、如何写中断中断中断、共享中断、中断上下文中断状态等。[关键词]中断,异常,hw_interrupt_type,irq_desc_t,irqaction,asm_do_irq,软中断,进程切换,中断注册释放请求_IRQ,free_irq,共享中断,重入,中断上下文1 Linux中断的组织1.1 IRQ描述符irq_desc对于每个IRQ中断行,Linux由一个irq_desc_t数据结构描述,我们称之为IRQ描述符。形成一个全局数组irq_desc[]。它是在/include/Linux/IRQ . h:struct IRQ _ desc中断描述符148 struct IRQ _ desc { 149 IRQ _ flow _ handler _ to handle _ IRQ;150结构irq _ chip *芯片;151 void *handler数据;152 void * chip _ data153结构动作;/* IRQ动作列表*/154未签名int状态;/* IRQ状态*/155 156无符号整数深度;/*嵌套irq禁用*/157无符号int wake _ depth/*嵌套唤醒启用*/158无符号int irq _ count/*用于检测损坏的IRQs */159无符号整数irqs _未处理;160 spinlock_t锁;161 # if def CONFIG _ SMP 162 CPU mask _ t关联性;163无符号整数cpu164#endif 171常量char * name172 } _ _ _ _ cacheline _ aligned173 174外部结构IRQ _ desc IRQ _ desc[NR _ IRQS];句柄:指向上层通用中断处理程序的指针。如果未设置,则默认为__do_IRQ()。一般来说,电子平触发器或边缘触发器有不同的处理功能。每个分隔线可以单独设置;芯片:底层中断的各种访问控制方法的集合,每个CPU实现不同,属于面向对象的中间层中断处理方法的底层部分。handler _ data:handle _ IRQ的附加参数。芯片数据:芯片的平台相关附加参数;动作:指向单向链表的指针,单向链表是描述中断服务例程的动作结构;状态:中断当前状态;深度:中断关闭和打开的层数。如果该IRQ中断线路被启用,深度为0,如果该IRQ中断线路被禁用多次,深度为正数。如果深度等于0,则每次调用disable_irq()时,该函数都会将该字段的值加1,并禁用该irq中断线路。相反,每当调用enable_irq()函数时,该函数将该字段的值减1;如果深度变为0,该功能使能该IRQ中断线路。

锁:这个中断描述符是一个全球共享的暑假。对于SMP,需要对目录:/proc/IRQ/条目名称:/proc/中断进行独占访问。中断描述符中显示的中断名称“___cacheline_aligned”表示该数据结构的存储按32字节(缓存行大小)对齐。以便将来存储在缓存中,并易于被Linux v 2 . 6 . 19/arch/arm/kernel/IRQ . c 157 void _ _ initi nit _ IRQ(void)158 { 159 intrq;160 161(IRQ=0;irq NR _ IRQSirq ) 162 irq_desc[irq]。状态|=IRQ _ NOREQUEST | IRQ _ DELATED _ DISABLE 163 IRQ _ NOPROBE;164 165 # if def CONFIG _ SMP 166 bad _ IRQ _ desc . affinity=中央处理器_屏蔽_全部;167 bad _ IRQ _ desc . CPU=SMP _ processor _ id();168 # endif 169 init _ arch _ IRQ();170} 1.2中断控制器描述符irq_chip由于处理器不同,每个处理器处理中断的方式也不同。为了实现统一的中断处理,Linux在底层提供了一个抽象的中断处理接口。对于每个平台,需要实现底部的接口功能。这样,就不需要改变上层的通用中断处理程序。Struttirq _ chip-chip级中断描述符94 struttirq _ chip { 95 const char * name;96无符号int (*startup)(无符号int IRQ);97 void(*关机)(无符号int IRQ);98 void (*enable)(无符号整数IRQ);99 void (*disable)(无符号整数IRQ);100 101 void (*ack)(无符号整数IRQ);102 void (*mask)(无符号整数IRQ);103 void (*mask_ack)(无符号整数IRQ);104 void (*unma

展开阅读全文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值