Linux操作系统之中断上半部

本文详细介绍了Linux操作系统中断上半部的相关概念,包括中断的分类、作用、中断与异常的区别、中断处理机制以及中断描述符表等。强调了中断处理的紧急性和非紧急性操作,并探讨了中断处理程序如何在多处理器系统中处理中断,特别是I/O中断的处理流程。此外,还提及了中断控制器如APIC的角色以及中断共享和动态分配的策略。
摘要由CSDN通过智能技术生成

中断上半部

中断的概念

中断通常被定义为一个事件,这个事件改变处理器执行的指令顺序。

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

  • 同步中断是指当指令执行时由cpu控制单元产生的,之所以称为同步是应为它在一条指令终止执行后之后cpu才发出中断。
  • 异步中断是由其他硬件设备依照cpu时钟信号随机产生的。

intel手册将同步中断称为异常,异步中断称为中断。

中断是由间隔定时器和I/O设备产生的,比如我们的键盘输入。另一方面来说异常是由程序错误产生的,比如除以0,或者内核必须处理的异常(缺页异常)。

中断的作用

中断提供了一种特殊的方法,使得处理器暂停当前正在执行的程序流转去执行其他代码。当一个中断信号到达的时候,cpu必须停止当前他正在做的事,并且切换到一个新的活动。为了做到这点需要在内核态堆栈保存程序计数器当前的值(eip和cs寄存器内容)并把与中断类型相关的一个地址放入程序计数器。

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

  • 当内核正打算去完成一些别的事情时,中断随时会到来。因此,内核的目标就是让中断尽可能快地处理完,尽其所能把更多的处理向后推迟。例如,假设一个数据块已到达了网线,当硬件中断内核时,内核只简单地标志数据到来了,让处理器恢复到它以前运行的状态,其余的处理稍后再进行(如把数据移入一个缓冲区,它的接收进程可以在缓冲区找到数据并恢复这个进程的执行)。因此,内核响应中断后需要进行的操作分为两部分:关键而紧急的部分,内核立即执行;其余推迟的部分,内核随后执行。
  • 因为中断随时会到来,所以内核可能正在处理其中的一个中断时,另一个中断(不同类型)又发生了。应该尽可能多地允许这种情况发生,因为这能维持更多的I/0设备处于忙状态。因此,中断处理程序必须编写成使相应的内核控制路径能以嵌套的方式执行。当最后一个内核控制路径终止时,内核必须能恢复被中断进程的执行,或者,如果中断信号已导致了重新调度,内核能切换到另外的进程。
  • 尽管内核在处理前一个中断时可以接受一个新的中断,但在内核代码中还是存在一些临界区,在临界区中,中断必须被禁止。必须尽可能地限制这样的临界区,因为根据以前的要求,内核,尤其是中断处理程序,应该在大部分时间内以开中断的方式运行。

中断和异常

中断:

可屏蔽中断(maskable interrupt)

I/O设备发出的所有中断请求(IRQ)都产生可屏蔽中断。可屏蔽中断处于两种状态:屏蔽的或非屏蔽的;一个屏蔽的中断只要还是屏蔽的,控制单元就忽略他。我们利用中断允许标志位的设置来判断cpu是否会响应中断请求。

非屏蔽中断(nomaskable interrupt)

只有几个危急事件(硬件故障)才引起非屏蔽中断。非屏蔽中断总是由cpu辨认。不受中断允许标志的影响,不能用软件进行屏蔽。

异常:

处理器探测异常(processor-detected exception)

当CPU执行指令时探测到的一个反常条件所产生的异常。可以进一步分为三组,这取决于CPU控制单元产生异常时保存在内核态堆栈eip寄存器中的值。

故障(fault)

通常可以纠正,一旦纠正,程序就可以在不失连贯性的情况下重新开始。保存在eip中的值是引起故障的指令地址,因此,当异常处理程序终止时,那条指令会被重新执行。

陷阱(trap)

在陷阱指令执行后立即报告;内核把控制权返回给程序后就可以继续它的执行而不失连贯性。保存在eip中的值是一个随后要执行的指令地址。只有当没有必要重新执行已终止的指令时,才触发陷阱。陷阱的主要用途是为了调试程序。在这种情况下,中断信号的作用是通知调试程序一条特殊指令已被执行(例如到了一个程序内的断点)。一旦用户检查到调试程序所提供的数据,她就可能要求被调试程序从下一条指令重新开始执行。

异常中止(abort)

发生一个严重的错误,控制单元出了问题,不能在eip寄存器中保存引起异常的指令所在的确切位置。异常中止用于报告严重的错误,如硬件故障或系统表中无效的值或不一致的值。由控制单元发送的这个中断信号是紧急信号,用来把控制权切换到相应的异常中止处理程序,这个异常中止处理程序除了强制受影响的进程终止外,没有别的选择。

编程异常(programmed exception)

在编程者发出请求时发生。是由int或int3指令触发的;当into(检查溢出)和bound(检查地址出界)指令检查的条件不为真时,也引起编程异常。控制单元把编程异常作为陷阱来处理。编程异常通常也叫做软中断(software interrupt)。这样的异常有两种常用的用途:执行系统调用及给调试程序通报一个特定的事件。

每个中断和异常都是由0~255之间的一个数来表示,intel将这个8位的无符号整数叫做向量,非屏蔽中断的向量和异常的向量是固定的,而可屏蔽中断的向量可以通过对中断控制器的编程来改变。

IRQ和中断

每个能够发出中断请求的硬件设备控制器都有一条名为IRQ(Interrupt ReQuest)的输出线。所有现有的IRQ线(IRQ line)都与一个名为可编程中断控制器(Programmable Interrpt Cantcauer.PIC)的硬件电路的输入引脚相连。可编程中断控制器执行下列动作:

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

  2. 如果一个引发信号出现在IRQ线上:
    a.把接收到的引发信号转换成对应的向量
    b.把这个向量存放在中断控制器的一个I/O端口,从而允许CPU通过数据总线读此向量。
    c.把引发信号发送到处理器的INTR引脚,即产生一个中断。
    d.等待,直到CPU通过把这个中断信号写进可编程中断控制器的一个I/O端口来确认它,当这种情况发生时,清INTR线。

  3. 返回到第1步。

IRQ线是从0开始顺序编号的,因此,第一条IRQ线通常表示成IRQ0。与IRQn关联的Intel的缺省向量是n+32。如前所述,通过向中断控制器端口发布合适的指令,就可以修改IRQ和向量之间的映射。
可以有选择地禁止每条IRQ线。因此,可以对PIC编程从而禁止IRQ,也就是说,可以告诉PIC停止对给定的IRQ线发布中断,或者激活它们。禁止的中断是丢失不了的,它们一旦被激活,PIC就又把它们发送到CPU。这个特点被大多数中断处理程序使用,因为这允许中断处理程序逐次地处理同一类型的IRQ。
有选择地激活/禁止IRQ线不同于可屏蔽中断的全局屏蔽/非屏蔽。当eflags寄存器的IF标志被清0时,由PIC发布的每个可屏蔽中断都由CPU暂时忽略。cli和sti汇编指令分别清除和设置该标志。
传统的PIC是由两片8259A风格的外部芯片以“级联”的方式连接在一起的。每个芯片可以处理多达8个不同的IRQ输入线。因为从PIC的INT输出线连接到主PIC的IRQ2引脚,因此,可用IRQ线的个数限制为15

APIC(高级可编程中断控制器)

单处理器系统需要使用pic,如果系统中有多个cpu那么主pic的输出线就不可以直接连接到cpu的intr引脚,所以需要更复杂的pic。

I/O APIC的组成为: 一组24条IRQ线,一张24项的中断重定向表(Interrupt Redirection Table),可编程寄存器,通过APIC总线发送和接收APIC信息的一个信息单元。与8259A的IRQ引脚不同,中断优先级与引脚号没有关系: 中断重定向表中的每一项都有可以被单独编程以指明中断向量和优先级、目标处理器以及选择处理器的方式。重定向表中的信息用于把每个外部IRQ信号转换为一条消息,然后,通过APIC总线把消息发送给一个或者多个本地APIC单元。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nnvHVfqk-1611567823764)(https://i.loli.net/2020/12/08/1WjsbvF3uQJA5RC.png)]

系统中另一个重要的部份为 I/O APIC。系统中最多可拥有 8 个 I/O APIC。它们会收集来自 I/O 装置的 Interrupt 讯号且在当那些装置需要 interrupt 时传送讯息至本机 APIC。每个 I/O APIC 有一个专有的 interrupt 输入 (或 IRQ) 号码。Intel 的 I/O APIC 通常有 24 个输入 – 其它的可能有多逹 64 个。而且有些机器拥有数个 I/O APIC,每一个分别有自己的输入号码,加起来一台机器上会有上百个 IRQ 可供装置 Interrupt 使用。

异常

80x86微处理器大概发布了20多种异常,内核必须为每种异常提供一个专门的异常处理程序。对于某些异常,CPU控制单元在开始执行异常处理程序前会产生一个硬件出错码(hardware error code),并且压入内核态堆栈。
下面的列表给出了在80x86处理器中可以找到的异常的向量、名字、类型及其简单描述。更多的信息可以在Intel的技术文挡中找到。

0- “Divide error”(故障)
当一个程序试图执行整数被0除操作时产生。

1-“Debug”(陷阱或故障)
产生于:

	1)设置eflags的T标志时(对于实现调试程序的单步执行是相当有用的)2)一条指令或操作数的地址落在一个活动debug寄存器的范围之内。

2-未用
为非屏蔽中断保留(利用NMI引脚的那些中断)3 - “Breakpoint”(陷阱)int3(断点)指令(通常由debugger插入)引起。

4-“Overflow”(陷阱)
当eflags的OF (overflow)标志被设置时,into(检查溢出)指令被执行。

5-“Bounds check”(故障)
对于有效地址范围之外的操作数,bound(检查地址边界)指令被执行。

6-“Invalid opcode”(故障)
CPU执行单元检测到一个无效的操作码(决定执行操作的机器指令部分)7-"Device not available”(故障)
随着cr0的TS标志被设置,ESCAPE,MMX或XMM指令被执行。

8-“Double fault”(异常中止)
正常情况下,当CPU正试图为前一个异常调用处理程序时,同时又检测到一个异常,两个异常能被申行地处理,然而,在少数情况下,处理器不能串行地处理它们,因而产生这种异常。

9-“Coprocessor segmeni overrun”(异常中止)
因外部的数学协处理器引起的问题(仅用于80386微处理器)10- “Invalid TSS"(故障)
CPU试图让一个上下文切换到有无效的TSS的进程。

11-“Segment not present"(故障)
引用一个不存在的内存段(段描述符的Segment-Present标志被清0)12-“Srack segment fault”(故障)
试图超过栈段界限的指令或者由ss标识的段不在内存。

13-“General protection“(故障)
违反了80x86保护模式下的保护规则之一。

14-“Page fault”(故障)
寻址的页不在内存,相应的页表
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值