异常与中断¶
【考频统计】:
| 年份 | 考点 | 分值 |
|---|---|---|
| 2009 | 外部中断事件、中断方式数据传送 | 2+3=5分 |
| 2010 | 中断服务程序、中断处理程序 | 2*2=4分 |
| 2011 | 中断响应优先级、中断屏蔽字 | 2分 |
| 2012 | 中断隐指令、中断处理程序 | 2*2=4分 |
| 2013 | 中断I/O方式 | 2分 |
| 2014 | 中断I/O方式 | 2分 |
| 2015 | 内部异常、中断处理、软中断 | 4分 |
| 2016 | 中断与异常的分类、中断服务程序、中断响应阶段 | 2+5=7分 |
| 2017 | 多重中断 | 2分 |
| 2018 | 外部I/O中断、中断优先级、中断隐指令、中断服务程序、中断I/O方式 | 6分 |
| 2019 | 缺页异常处理、中断I/O方式时间开销分析 | 4分 |
| 2020 | 外部中断事件、不可屏蔽中断与可屏蔽中断、中断操作哪些由OS完成 | 6分 |
| 2021 | 异常事件、多重中断、中断响应周期 | 4分 |
| 2022 | 中断I/O方式、异常处理 | 4分 |
| 2023 | 中断与异常的检测 | 2分 |
【名词解释】
- 向量中断 : 是指一种识别中断源的技术或方式。识别中断源的目的就是要找到中断源对应的中断服务程序的入口地址,即获得向量地址。采用向量中断进行中断源识别的做法是,采用某种硬件排队线路(如菊花链、并行判优等),对所有未被屏蔽的中断请求进行排队,选出优先级最高的中断源,然后对其编码,得到该中断源的编号(有些书中称其为向量地址),通过总线将其取到CPU中,转换成向量地址,从而取出中断服务程序入口地址或跳转到中断服务程序。还有一种中断源识别方式是用程序(称为中断查询程序)进行识别的软件方法。
- 中断向量(
interrupt vector):每个中断源都有对应的处理程序,这个处理程序被称为中断服务程序,其入口地址称为中断向量。 - 中断向量表(
interrupt vector table): 所有中断(包括异常)的中断服务程序入口地址构成一个表,该表被称为中断向量表;也有的机器把中断服务程序入口的跳转指令构成一张表,该表被称为中断向量跳转表。 - 向量地址(
vector address)向量地址是指中断向量表或中断向量跳转表中每个表项所在的内存地址。 - 中断类型号(
interrupt number): 中断类型号是指中断向量表或中断向量跳转表中每个表项所在的表项索引值。 - 中断服务程序(
interrupt service routine): 中断服务程序是指操作系统内核中专门用于针对具体的外部中断进行处理的程序,也称为中断处理程序。当发现中断时,CPU就会把当前正在执行的用户进程停下来,调出操作系统内核中的专门处理相应中断类型的程序来执行,这个程序就是中断服务程序。 - 中断屏蔽字寄存器(
interrupt maskword register): 指中断控制器中专门用来存放每个中断源对应的中断屏蔽字的寄存器。 - 中断请求寄存器(
interrupt request register) : 指中断控制器中专门用来存放每个设备对应的中断请求信号的寄存器。 - 中断响应优先级(
interrupt response priority): 指当多个中断请求发生时,优先响应哪个中断请求。它是由中断控制器中的硬件排队线路或中断查询程序的查询顺序决定的,不可动态改变。 - 中断处理优先级(
interrupt process priority): 反映的是正在处理的中断是否比新发生的中断的处理优先级低(即屏蔽位为“0”,对新中断开放),如果是,就中止正在处理的中断,转到新中断服务程序去执行,处理完后回到原来被中止的中断服务程序继续执行。中断处理优先级可以由中断屏蔽字来动态改变。 - 多重中断(
multiple interrupt): 在中断处理(即执行中断服务程序)过程中,如果又有新的处理优先级更高的中断请求发生,那么CPU应立即中止正在执行的中断服务程序,转去处理新的中断,这种情况被称为多重中断或中断嵌套。 - 异常和中断请求的检测、异常和中断的响应都是由硬件完成。
- 时钟中断
Note
时钟中断是系统时钟产生的中断,更新系统时间、时间片下的进程调度、延时操作等与时间相关的操作均依赖时钟中断来实现。
【例题】:下面关于时钟中断的说法,正确的说法个数是()\ ①时钟中断的产生频率由硬件决定\ ②时钟中断属于程序性中断\ ③时钟中断时间间隔是计算机中的基本计时单位 ④时钟中断的处理可能引发进程调度
A.1个 B.2个 C.3个 D.4个
本题需要区分CPU时钟和系统时钟,前者与时钟周期相关,是计算机的固有硬件属性,后者用来负责时钟中断,可以由操作系统来进行设定和初始化。
时钟中断由系统时钟发出,属于外中断,②错误;
系统时钟可以由操作系统来进行设定和初始化,因此①错误;
计算机中的基本计时单位是由CPU时钟决定的时钟周期,因此③错误;
发生时钟中断时,操作系统会检查当前进程的时间片,若时间片用完则触发进程调度,因此④正确。答案选A。
CPU时钟周期与操作系统时钟中断的时钟区别与定义
1. CPU时钟周期(CPU Clock Cycle)
定义:CPU时钟周期是处理器内部的硬件时钟信号,由CPU的主频(Clock Speed)决定。例如,一个2.5GHz的CPU每秒有2.5×10⁹个时钟周期。每个时钟周期对应一个固定的时间单位,用于同步CPU内部的操作。
作用:
同步操作:CPU的指令执行、数据传输、寄存器更新等操作都依赖于时钟周期的同步。
决定性能:时钟频率越高,CPU在单位时间内能完成的指令数越多,性能越强。
硬件基础:由CPU内部的振荡器(如石英晶体)生成,是处理器的核心时间基准。
特点:
高频:通常为GHz级别(如1GHz=10⁹次/秒)。
硬件驱动:完全由硬件生成,与操作系统无关。
细粒度:用于精确控制CPU内部的微操作(如取指、译码、执行等)。
2. 操作系统时钟中断(System Clock Interrupt)
定义:操作系统时钟中断是由硬件定时器(如系统定时器或实时时钟RTC)触发的软件中断,用于协调操作系统的时间管理任务。例如,每秒触发100次或1000次中断。
- 作用:
- 进程调度:通过时间片轮转(Time Slicing)实现多任务切换。
- 时间管理:更新系统时间、记录进程运行时间、处理定时器事件。
- 资源管理:监控进程状态(如超时、阻塞)、维护系统日志等。
- 特点:
- 低频:通常为Hz级别(如100Hz~1000Hz)。
- 软件依赖:由操作系统配置和管理
示例说明
- CPU时钟周期:\ 假设CPU主频为3GHz,每个时钟周期为约0.333纳秒。执行一条简单指令可能需要多个时钟周期(如取指、译码、执行、写回)。
- 操作系统时钟中断:\ 操作系统配置每秒触发100次时钟中断。每次中断时,内核会检查是否有进程需要调度、更新系统时间、处理定时器事件等。
时钟中断
时钟中断是计算机系统中的一种重要中断类型,主要用于计时和控制时间相关的操作。它由系统时钟(通常是一个硬件定时器)周期性地发出,用来中断当前正在执行的程序,转而执行特定的中断处理程序。时钟中断在操作系统中的作用至关重要,以下是详细介绍。
时钟中断的工作原理
- 硬件定时器:计算机系统中有一个专门的硬件定时器,它根据设定的时间间隔周期性地产生时钟中断。
- 中断信号:当定时器达到设定的时间间隔时,会向CPU发送中断信号。
- 中断处理:CPU收到时钟中断信号后,会暂停当前执行的任务,保存当前的CPU状态,然后转到中断向量表中对应的中断处理程序。
- 中断服务程序(ISR - Interrupt Service Routine):时钟中断的ISR由操作系统提供,负责处理各种时间相关的任务。
时钟中断的主要功能
- 更新系统时间:
- 时钟中断的一个主要任务是更新系统时钟。每次时钟中断发生时,ISR会更新系统维护的时间变量,这样系统时间才能准确反映当前时间。
- 时间片管理和进程调度:
- 在多任务操作系统中,时钟中断用于时间片的管理。每个进程分配一个时间片,时钟中断会检查当前进程的时间片是否用完。如果用完,操作系统会触发进程调度,将CPU分配给其他进程。
- 系统计时:
- 时钟中断用于实现系统计时功能,如延时操作、定时任务、超时检测等。操作系统通过时钟中断提供的计时机制可以实现精确的时间控制。
- 性能监控:
- 时钟中断可用于性能监控和统计,如计算CPU利用率、记录程序运行时间、统计系统负载等。
时钟中断的实现细节
- 硬件初始化:
- 在系统启动时,操作系统会初始化硬件定时器,设定时钟中断的频率。例如,设置定时器每10毫秒产生一次中断。
- 中断向量表:
- 中断向量表是一个数据结构,其中包含了各类中断的入口地址。时钟中断对应的ISR地址也保存在这里,当中断发生时,CPU会跳转到该地址执行ISR。
- ISR的实现:
- 时钟中断的ISR实现包括更新系统时间、处理进程调度、执行定时任务等。ISR通常是操作系统内核的一部分,需要高效和快速地执行,以减少中断处理时间对系统性能的影响。
时钟中断的应用
- 实时系统:
- 在实时操作系统中,时钟中断尤为重要,确保系统能够在规定的时间内响应事件。
- 多任务系统:
- 在支持多任务的系统中,时钟中断用于公平地分配CPU时间给各个任务,防止某个任务长期占用CPU。
- 计时和延时:
- 在需要精确计时和延时的应用中,如动画、音频播放、网络通信等,时钟中断提供了基础的时间控制机制。
时钟中断是现代操作系统中必不可少的机制,支持系统时间更新、进程调度、延时操作和性能监控等功能。通过硬件定时器周期性地产生中断信号,并由操作系统内核的ISR处理,时钟中断确保系统能够高效、准确地管理时间相关的操作。
- 硬中断与软中断
硬中断不等价于硬件中断,软中断也不等价于软件中断。硬中断指的是中断响应过程由硬件实现的中断,408范围内题目不做特殊说明都是硬中断。软中断是纯粹由软件实现的一种类似中断的机制,实际上它就是模仿硬件,在内存中有一个地方存储着软中断的标志位,然后由内核的一个线程不断轮询这些标志位,如果有哪个标志位有效,则再去另一个地方寻找这个软中断对应的中断处理程序。
软中断指令
INTn被设定为一种陷阱异常,例如,Linux通过int$0x80指令将128号设定为系统调用,而Windows通过in s0x2e指令将46号设定为系统调用。
- 可编程中断控制器(
Programmable Interrupt Controller,PIC)
可编程的中断控制器即可编程的中断控制接口。中断控制器的基本功能包括以下几个方面:
- ①及时记录各种中断请求信号,通常用一个中断请求寄存器来保存;
- ②自动响应中断请求,CPU在每条指令执行完后,会自动检测中断请求引脚,发现有中断请求后会自动响应中断;
- ③在同时有多个中断请求时,能自动选择响应优先级最高的中断请求;
- ④通过中断屏蔽实现多重中断的嵌套执行,中断屏蔽功能通常用一个中断屏蔽字寄存器来实现。
- 异常和中断事件形成的异常控制流与进程上下文切换引起的异常控制流有何不同?
答:在一个进程正常运行过程中,可能会出现一些特殊事件,这些事件的发生将导致当前进程无法继续执行下去。这些特殊事件统称为异常(
exception)或中断(interrupt)。发生异常或中断时,CPU必须转到具体的处理特殊事件的异常处理程序或中断服务程序去执行,因而正在执行的进程的逻辑控制流被打断,从而引起一个异常控制流。不过,这种异常控制流与上下文切换引起的异常控制流有一个明显的不同:进程上下文切换后,CPU执行的是另一个用户进程;而对于中断或异常引起的异常控制流,其调出的异常处理程序或中断服务程序并不是一个进程,而是一个“ 内核控制路径 ”,异常处理程序或中断服务程序是代表异常或中断发生时正在运行的当前进程在内核态执行的一个独立指令序列。它作为一个内核控制路径,比进程更“轻”,其上下文信息比一个进程的上下文信息少得多。
- 中断方式下,外设任何时候都可以申请中断并马上得到响应吗?
答:不是。中断方式下,外设何时发出中断请求是由外设接口中的中断逻辑决定的,不受CPU的限制,但何时响应中断与CPU执行指令过程有关。CPU总是在一条指令执行完、取下条指令之前去查询有无中断请求。如果此时是开中断状态,并有未被屏蔽的中断请求发生,则CPU进入中断响应周期,自动执行一条隐指令,完成关中断、保护断点、取中断向量三个操作。因此,不是任何时候都马上响应中断。中断响应的条件有三个:①CPU处于开中断状态(中断允许触发器EINT置“1”状态);②至少有一个未被屏蔽的中断请求发生;③一条指令执行结束。
- 为什么在响应中断的时候保存断点,而在处理中断的时候保存现场?
答:断点是中断返回到被中断程序继续执行处指令的地址(即响应中断时PC的值),其在中断响应时先被保存到栈中,否则,当取来中断服务程序的首地址送PC后,原来作为断点的PC的值就被破坏了;而现场是被中断的原程序在断点处各个寄存器的值,只要在这些寄存器再被使用前保存到栈中即可。因为在实际处理中断事件过程中可能要用到这些寄存器,所以在实际处理之前的准备阶段来保存现场(寄存器压栈),而在实际处理后的结束阶段再恢复现场(寄存器出栈)。这样就能保证被中断程序的现场不被中断服务程序破坏。
- 单重中断和多重中断的区别是什么?
答:单重中断情况下,在中断处理整个过程中,不允许响应新的中断请求,其做法是在中断响应开始时关中断(使中断允许触发置“0”),而直到中断处理结束后才开中断,然后返回到原断点处继续执行。\ 多重中断系统中,如果在进行某个中断请求的处理过程中,又发生了新的中断请求,则可以中止正在进行的中断处理,转到新的中断服务程序执行。因此,在中断处理过程中,应该开中断,允许响应新的中断请求。其做法是在实际处理中断事件前就开中断,而不是像单重中断那样在处理后才开中断。这样保证在实际中断处理过程中可以响应新的中断请求。
IA-32和Linux分别代表了硬件和软件(操作系统内核),根据它们各自在整个异常和中断处理过程中所做的具体工作,能否归纳总结出硬件和软件在异常和中断处理过程中分别完成哪些主要工作?
Info
答:在异常和中断处理过程中,硬件主要包括CPU和I/O模块两方面的工作,I/O模块主要是针对中断处理。\
(1)CPU在执行指令过程中需要对各种异常事件进行检测,例如,是否在取指令时发生了缺页故障(page fault),是否在指令译码时发生了非法操作,是否整除指令的除数为0,是否取数时发生缺页故障,是否执行的是陷阱指令,是否是单步跟踪等。如果发生了以上任何异常事件,则CPU根据检测结果得到异常类型号,然后进入异常响应处理阶段。\
(2)CPU在执行完每条指令、取下条指令之前,要检测中断请求线(包括不可屏蔽中断请求线)是否有效,若发现有中断请求,则通过中断查询线发出中断回答信号,启动中断控制器对所有未被屏蔽的中断请求信号根据响应优先级进行排队,中断控制器选择响应优先级最高的中断请求,生成相应的中断类型号,通过数据总线回送给CPU,CPU得到中断类型号后,进入中断响应处理阶段。\
(3)在异常或中断响应处理阶段,CPU要完成从发生异常或中断的进程的执行转到在内核态下异常处理程序和中断服务程序的执行,这个过程通常需要完成三个操作:保存断点和程序状态、关中断、根据异常或中断类型号转到异常处理程序或中断服务程序的第一条指令执行。随后的处理就由软件来完成。\
在异常和中断处理过程中,当CPU完成对异常或中断的响应处理后,就会调出异常处理程序或中断服务程序,因此,软件对异常和中断处理主要是在异常处理程序或中断服务程序中进行的处理。对于不同异常和中断类型,其对应处理程序的功能也完全不同。\
此外,软件(操作系统)还需要对异常处理程序和中断服务程序以及相应的中断向量表或中断描述符表进行初始化工作。
- 对于中断和异常的处理,操作系统所做的工作有什么?\ 编写中断服务程序\ 操作系统程序员所做的核心工作便是为各类中断(异常) 编写中断服务程序, 当中断和异常被触发时, 系统进入内核态并跳转到中断服务程序来执行操作系统程序。\ 设置中断向量表\ 操作系统被加载到内存后, 最先执行操作系统初始化程序, 在这个过程中一项重要的工作便是设置中断向量表: 由操作系统程序员编写的各类中断服务程序均被加载到了内存中的特定位置(内核空间里), 此时, 需要设置中断向量表, 使各种中断源与其中断服务程序的地址对应起来。

Danger
IA-32采用向量中断方式,可以处理256种不同类型的异常和中断,每个异常或中断都有唯一的编号,称之为中断类型号(也称向量号),并且还有与其对应的异常处理程序或中断服务程序,其入口地址放在一个专门的中断向量表中。例如,类型0为“除法错”,类型2为“NMI中断”,类型14为“缺页”等。\
IA-32中前32个中断类型(0~31)保留给处理器使用,剩余的可以由操作系统自行定义功能。通过执行指令INTn(指令的第二字节给出中断类型号n,n=0~255)使CPU自动转到操作系统编写的中断服务程序执行。
在实地址模式下,异常处理程序或中断服务程序的入口地址称为中断向量,用来存放256个中断向量的数据结构就是中断向量表, 固定在00000H~003FFH的内存区域内。 实地址模式(Real Mode)采用20位存储器地址空间,即可寻址空间为1MB,不支持分页存储管理机制。每个存储单元地址由16位段地址左移4位后与16位偏移量相加而得到,即指令地址=CS<<4+IP。

开机后系统首先在实地址模式下工作,需要先准备在实地址模式下的中断向量表和中断服务程序。通常,这个准备工作是由固化在计算机主板上的一块ROM芯片中的BIOS程序来完成的。BIOS程序首先检测显卡、键盘、内存等,并在主存的00000H~003FFH区域建立中断向量表,同时,在中断向量所指的主存区域建立相应的中断服务程序
BIOS利用INT指令执行特定的中断服务程序可以把操作系统内核程序从磁盘加载到内存中。例如,BIOS可以通过执行指令int0x19来调用中断向量0x19对应的中断服务程序,将启动盘上的0号磁头对应盘面的0磁道1扇区中的引导程序装入内存。
BIOS中包含了各种基本设备的驱动程序,通过执行BIOS程序,这些基本设备驱动程序以中断服务程序的形式被加载到内存中,以提供基本I/O系统调用。一旦进入保护模式,就不再使用BIOS。
- 实模式下,用中断向量表描述
- 保护模式下,用中断描述符表描述
IA-32的保护模式并不像实地址模式那样将异常处理程序或中断服务程序的入口地址直接填入0000H-003FH存储区,而是借助于中断描述符表来获得异常处理程序或中断服务程序的入口地址。
IA-32中定义了19种确定的中断或异常类型,类型号为0-14和16~19。在19种预定义的类型中,大部分都是故障类异常,主要是由于执行了特定的指令而引起的。
除了19种确定的类型外,还有224种用户自定义类型,类型号为32~255,其中一部分类型用于外部可屏蔽中断,一部分用于软中断。可屏蔽中断通过CPU的
INTR引脚向CPU发出中断请求,中断请求号为IRQ0、IRQ1、….、IRQ15等。软中断指令INTn被设定为一种陷阱异常,例如,Linux通过int$0x80指令将128号设定为系统调用,而Windows通过in $0x2e指令将46号设定为系统调用。\ 保护模式下,借助于中断描述符表来获得异常处理程序或中断服务程序的入口地址。中断描述符表(Interupt Descriptor Table,IDT)是操作系统内核中的一个表,共有256个表项,对应上表所示的256个异常和中断。每一个表项是一个中断门描述符、陷阱门描述符或任务门描述符,如图所示是中断门描述符格式。
DPL给出访问本段要求的最低特权等级。因此,DPL为0的段只能当CPL为0(内核态)可访问,而对于DPL为3的段,则任何进程都可以访问。在DPL后面的一位都是0、再后面四位用来标识门的类型(TYPE)。若是中断门,则TYPE=1110B;若是陷阱门,则TYPE=1111B;若是任务门,则TYPE=0101B。\ 中断门描述符和陷阱门描述符中都会给出一个16位的段选择符和32位的偏移地址。段选择符来指示异常处理程序或中断服务程序所在段的段描述符在GDT或LDT中的位置,偏移地址则给出异常处理程序或中断服务程序第一条指令所在的偏移量。将
IDTi中的段选择符装入CS,IDTi中的偏移地址装入EIP,它们是异常处理程序或中断服务程序第一条指令的逻辑地址。Linux内核在启用异常和中断机制之前,需要先设置好每个
IDT的表项IDTi(0≤i<256),并把IDT的首地址存入IDTR寄存器。这个工作是在系统初始化时完成的。\ 系统初始化时,Linux完成对GDT、GDTR、IDT和IDTR等的设置,这样,以后一旦发生异常或中断,则CPU可以通过异常和中断响应机制调出异常或中断处理程序执行。
1.1 异常与中断的概念与分类¶
1.1.1 异常与中断的概念¶
一个进程在正常执行过程中,其逻辑控制流会因为各种特殊事件被打断,例如时间片轮转处理器调度,在每个时间片到时,当前进程的执行被新进程打断。除此之外,打断进程正常执行的特殊事件还有:用户按下Ctrl+C键、当前指令执行时发生了不能使指令继续执行的意外事件、I/O设备完成了系统交给的任务需要系统进一步处理等。这些特殊事件统称为异常(exception)或中断(interrupt)。当发生异常或中断时,正在执行进程的逻辑控制流被打断,CPU转到具体的处理特殊事件的内核程序去执行。不同计算机体系结构和教科书对异常和中断这两个概念规定了不同的内涵。408考试中我们将使用Intel体系结构规定的“中断”和“异常”的概念。
在早期的Intel微处理器中,并不区分异常和中断,两者统称为中断,由CPU内部产生的意外事件称为“内中断”,从CPU外部通过中断请求引脚INTR和NMI向CPU发出的中断请求为“外中断”。从80286开始,Intel统一把“内中断”称为异常,而把“外中断”称为中断。
Intel对异常和中断进行了如下描述:处理器提供了异常和中断这两种打断程序正常执行的机制。中断是一种典型地由I/O设备触发的、与当前正在执行的指令无关的异步事件;而异常是处理器执行一条指令时,由处理器在其内部检测到的、与正在执行的指令相关的同步事件。有时为了强调异常是CPU内部执行指令时发生,而中断是CPU外部的I/O设备向CPU发出的请求,特称异常为“内部异常”,而称中断为“外部中断”。实际上,异常和中断两者的处理过程基本上是相同的,这也是为什么在有些体系结构或教科书中将两者统称为“中断”或统称为“异常”的原因。异常和中断引起的异常控制流如图所示。


图中反映了从CPU检测到用户进程发生异常或中断事件,到CPU改变指令执行控制流而转到操作系统中的异常或中断处理程序执行,再到从异常或中断处理程序返回用户进程执行的过程。
异常和中断处理的大致过程如下:

当CPU在执行当前程序或任务(即用户进程)的第i条指令时检测到一个异常事件,或在执行第i条指令后发现有一个中断请求信号,则CPU会打断当前用户进程,然后转到相应的异常或中断处理程序去执行。若异常或中断处理程序能够解决相应问题,则在异常或中断处理程序的最后,CPU通过执行“异常/中断返回指令”回到被打断的用户进程的第i条指令或第i+1条指令继续执行;若异常或中断处理程序发现是不可恢复的致命错误,则终止用户进程。通常情况下,对于异常和中断事件的具体处理过程全部由操作系统(可能包括驱动程序)软件来完成。\ 通常,把处理异常事件的程序称为异常处理程序,把处理中断事件的程序称为中断服务程序,合在一起时称其为异常或中断处理程序。
中断技术的主要功能:
- 早期的中断技术是为了处理数据传送;
- 实现CPU与I/O设备的并行工作
- 处理硬件故障和软件错误
- 实现人机交互,用户干预机器需要用到中断系统
- 实现多道程序、分时操作,多道程序的切换需借助于中断系统。
- 实时处理需要借助中断系统来实现快速响应。
- 实现应用程序和操作系统(管态程序)的切换,称为“软中断”。
- 多处理器系统中各处理器之间的信息交流和任务切换。
1.1.2 异常与中断的分类¶
相关真题:¶
【2009-22】下列选项中,能引起外部中断的事件是( )。\ A. 键盘输入\ B. 除数为0\ C. 浮点运算下溢\ D. 访存缺页
解析
答案:A
外部中断(又称外中断)是指由 CPU执行指令之外的外部事件 引发的中断,通常来源于 外部设备的请求,如键盘、鼠标、定时器、打印机等I/O设备。外部中断一般通过中断控制器向CPU发送中断请求(IRQ)来触发。
- A. 键盘输入:正确。当用户按下键盘按键时,键盘控制器向CPU发出中断请求,属于典型的外部中断(可屏蔽中断),用于通知CPU有输入数据需要处理。
内部中断(又称内中断或异常)是由 CPU在执行指令过程中检测到的内部异常或特定指令 引发的,与程序执行状态相关,不依赖外部设备。
- B. 除数为0:错误。这是典型的内部中断(属于故障类异常),由算术运算错误引发,由CPU内部的异常处理机制处理。
- C. 浮点运算下溢:错误。属于浮点运算异常,由FPU(浮点单元)检测并触发异常,归类为内部中断。
- D. 访存缺页:错误。虽然涉及硬件(MMU)检测,但“缺页”是虚拟内存管理中的异常事件,属于内部中断的一种(页面错误异常),由操作系统通过异常处理程序(如缺页异常处理)解决。
【2015-22】内部异常(内中断)可分为故障(fault)、陷阱(trap)和终止(abort)三类。下列有关内部异常的叙述中,错误的是( )。
A. 内部异常的产生与当前执行指令相关
B. 内部异常的检测由CPU内部逻辑实现
C. 内部异常的响应发生在指令执行过程中
D. 内部异常处理后返回到发生异常的指令继续执行
解析
答案:D
内部异常(又称内中断)是指由 CPU在执行指令过程中检测到的异常事件 所引发的中断,通常与当前执行的指令直接相关,由CPU内部硬件(如控制单元、运算单元、MMU等)检测并触发,不可屏蔽,需立即处理。
根据异常的行为和恢复方式,内部异常可分为三类:
- 故障(Fault):
- 发生在指令执行过程中,通常是可恢复的异常。
- 处理完成后,返回到发生异常的指令重新执行。
- 例如:缺页异常(Page Fault)——操作系统加载页面后,重新执行原指令。
- 陷阱(Trap):
- 通常由特定指令(如
int、syscall)主动引发,用于实现系统调用或调试。 - 是同步的、预期的异常。
- 处理完成后,返回到下一条指令继续执行(即异常指令之后)。
- 例如:系统调用
int 0x80执行后,返回时继续执行后续代码。
- 终止(Abort):
- 表示严重的、不可恢复的系统错误(如硬件故障、非法指令、校验错误等)。
- 不返回到原程序,通常导致程序或系统终止。
- A. 内部异常的产生与当前执行指令相关
✅ 正确。内部异常是同步异常,由当前执行的指令触发(如除零、非法地址访问、执行特权指令等),与具体指令密切相关。 - B. 内部异常的检测由CPU内部逻辑实现
✅ 正确。异常的检测由CPU内部硬件(如ALU、MMU、指令译码器等)完成,属于处理器内部机制,无需外部设备参与。 - C. 内部异常的响应发生在指令执行过程中
✅ 正确。内部异常是同步的,通常在指令执行的某个阶段被检测到(如取指、译码、执行、访存等),响应发生在该指令执行期间或完成前。 - D. 内部异常处理后返回到发生异常的指令继续执行
❌ 错误。这是对异常恢复行为的以偏概全。
- 故障(Fault):处理后重新执行原指令(如缺页)。
- 陷阱(Trap):处理后返回到下一条指令(如系统调用)。
- 终止(Abort):不返回,程序终止。
因此,并非所有内部异常都返回到原指令继续执行。D项表述过于绝对,不成立。
【2020-18】下列关于“自陷”(Trap,也称陷阱)的叙述中,错误的是( )。
A. 自陷是通过陷阱指令预先设定的一类外部中断事件
B. 自陷可用于实现程序调试时的断点设置和单步跟踪
C. 自陷发生后CPU将转去执行操作系统内核相应程序
D. 自陷处理完成后返回到陷阱指令的下一条指令执行
解析
答案:A
自陷(Trap) 是一种同步的内部异常(内中断),由程序中执行特定的“陷阱指令”(如 int、syscall、trap 等)主动引发,用于实现系统调用、调试功能、异常通知等。它不是外部事件,而是程序有意触发的控制转移机制。
A. 自陷是通过陷阱指令预先设定的一类外部中断事件 错误
- 自陷是内部异常(内中断),属于同步异常,由当前执行的指令直接引发。
- “外部中断”是由外部设备(如键盘、定时器)异步产生的,与当前指令无关。
- 虽然自陷是“预先设定”的(程序员插入陷阱指令),但其本质是内部事件,不是外部中断。
B. 自陷可用于实现程序调试时的断点设置和单步跟踪 ✅ 正确。
- 在调试中,断点通常通过插入一条陷阱指令(如
int 3在 x86 中)实现。 - 当程序执行到该指令时,触发自陷,控制权转移到调试器,实现暂停、查看变量等操作。
- 单步跟踪也可通过设置处理器的“单步模式”(由陷阱机制支持)实现
C. 自陷发生后 CPU 将转去执行操作系统内核相应程序 ✅ 正确。
- 自陷发生后,CPU 会切换到内核态,根据陷阱类型查找中断向量表,跳转到操作系统内核中的陷阱处理程序。
- 例如:系统调用陷阱会进入内核的
system_call入口,断点陷阱进入调试处理程序。
这是实现用户程序与操作系统交互的核心机制。
D. 自陷处理完成后返回到陷阱指令的下一条指令执行 ✅ 正确。
- 自陷是陷阱类异常,其特点是:处理完成后返回到触发指令的下一条指令(即顺序执行恢复)。
- 例如:执行
int 0x80发起系统调用,调用结束后返回到下一条指令继续执行。 - 这与“故障”(Fault)不同,故障是返回到原指令重新执行(如缺页异常)。
自陷的返回行为是“向前继续”,符合预期控制流。
【2020-20】下列事件中,属于外部中断事件的是( )。
Ⅰ. 访存时缺页
Ⅱ. 定时器到时
Ⅲ. 网络数据包到达
A. 仅Ⅰ、Ⅱ
B. 仅Ⅰ、Ⅲ
C. 仅Ⅱ、Ⅲ
D. Ⅰ、Ⅱ和Ⅲ
解析
答案:C
外部中断(External Interrupt)是指由 CPU外部硬件设备 发出的异步中断请求,与当前正在执行的指令无关,通常用于通知 CPU 有外部事件发生,如定时器超时、I/O 设备就绪等。与之相对的是 内部中断(又称异常或内中断),由程序执行过程中的错误或特定指令引发,是同步的,依赖于当前指令的执行。
Ⅰ. 访存时缺页
- 缺页是虚拟内存管理中的一种内部异常(Fault 类型)。
- 它由 CPU 在执行访存指令时检测到页表项无效而触发,与当前指令执行直接相关。
- 属于内中断,不是外部设备引发的中断。
Ⅱ. 定时器到时
- 定时器(Timer)是位于 CPU 外部或芯片级的硬件设备,周期性地产生中断信号。
- 当定时器计数结束(到时),会向 CPU 发送中断请求(如 IRQ0 在 x86 系统中),用于实现时间片调度、时钟更新等。
- 该事件独立于当前执行的指令流,是典型的可屏蔽外部中断。
Ⅲ. 网络数据包到达
- 当网卡接收到网络数据包后,会通过中断控制器向 CPU 发出中断请求,通知操作系统有数据到达,需要处理。
- 这是一种典型的 I/O 中断,由外部设备(网卡)主动发起,与当前程序执行无关。
- 属于异步外部中断,常用于实现高响应性的网络通信。
【2020-21】外部中断包括不可屏蔽中断(NMI)和可屏蔽中断,下列关于外部中断的叙述中,错误的是( )。
A. CPU处于关中断状态时,也能响应NMI请求
B. 一旦可屏蔽中断请求信号有效,CPU将立即响应
C. 不可屏蔽中断的优先级比可屏蔽中断的优先级高
D. 可通过中断屏蔽字改变可屏蔽中断的处理优先级
解析
答案:B
外部中断是由 CPU外部硬件设备 发出的中断请求,分为两类:
- 不可屏蔽中断(NMI, Non-Maskable Interrupt):
- 优先级高,不受中断允许标志(IF)控制,即使CPU处于“关中断”状态(IF=0),也必须响应。
- 常用于处理严重事件,如电源故障、硬件错误等。
- 可屏蔽中断(Maskable Interrupt):
- 通过INTR引脚等接收中断请求。
- 是否响应取决于 中断标志位(IF)是否为1(开中断)。
- 可通过中断屏蔽字(如IMR寄存器)屏蔽或允许特定中断源。
A. CPU处于关中断状态时,也能响应NMI请求
- NMI 的核心特性是“不可屏蔽”,其响应不依赖于中断标志位 IF。
- 即使 IF=0(关中断),只要发生NMI请求,CPU在当前指令执行完毕后就会响应。
👉 正确。
B. 一旦可屏蔽中断请求信号有效,CPU将立即响应
❌ 错误 —— 本题选 B。
CPU 响应可屏蔽中断需满足 三个条件:
- 有中断请求(中断源发出有效信号);
- CPU处于开中断状态(IF=1);
- 当前指令执行完毕,且无更高优先级事件(如NMI等)正在处理。
⚠️ 关键点:
- 中断响应是异步但不立即的,必须等到当前指令执行完成;
- 即使中断信号有效,若 IF=0 或正在执行关键指令,CPU 不会立即响应。
👉 因此,“立即响应”的说法是错误的。
C. 不可屏蔽中断的优先级比可屏蔽中断的优先级高
- NMI 的优先级高于所有可屏蔽中断,通常仅低于硬件复位。
- 一旦发生NMI,CPU在当前指令结束后立即响应,无需等待中断允许。👉 正确。
D. 可通过中断屏蔽字改变可屏蔽中断的处理优先级
- 中断屏蔽字(Interrupt Mask Register, IMR)用于选择性屏蔽某些可屏蔽中断源。
- 结合优先级仲裁机制(如中断控制器),可通过设置屏蔽字动态调整中断的响应顺序或优先级。
- 例如:屏蔽低优先级中断,使高优先级中断优先处理。
【2016-22】异常是指令执行过程中在处理器内部发生的特殊事件,中断是来自处理器外部的请求事件。下列关于中断或异常情况的叙述中,错误的是( )。
A. “访存时缺页”属于中断
B. “整数除以0”属于异常
C. “DMA传送结束”属于中断
D. “存储保护错”属于异常
解析
答案:A
A. “访存时缺页”属于中断 ❌ 错误 —— 本题选 A
缺页 是虚拟内存管理中的一种 页错误(Page Fault);它由 CPU 在执行访存指令时,发现所需页面不在物理内存中而主动触发的内部异常;虽然缺页处理可能由操作系统调度页面,但其触发机制是同步于当前指令执行的;因此,“缺页”属于异常(内中断),不是外部中断。将其归为“中断”是概念错误。
B. “整数除以0”属于异常 ✅ 正确。
除零是典型的 算术异常,由当前执行的除法指令引发;CPU 在执行过程中检测到除数为零时,立即终止该指令,跳转到异常处理程序;
C. “DMA传送结束”属于中断 ✅ 正确。
DMA 传送结束后,DMA 控制器会向 CPU 发出 中断请求,通知 CPU 数据已传输完成,可以进行后续处理;这个事件来自 CPU 外部硬件(DMA 控制器),与当前执行的指令无关;属于典型的 可屏蔽外部中断。
D. “存储保护错”属于异常 ✅ 正确。
存储保护错(如访问只读页面、越权访问内核空间)是由 内存管理单元(MMU)在地址转换时检测到违规访问 而触发的;与当前执行的指令直接相关,属于 同步异常;例如:段错误(Segmentation Fault)就是一种存储保护异常。
【2021-21】异常事件在当前指令执行过程中进行检测,中断请求则在当前指令执行后进行检测。下列事件中,相应处理程序执行后,必须回到当前指令重新执行的是( )。
A. 系统调用
B. 页缺失
C. DMA传送结束
D. 打印机缺纸
解析
答案:B
本题结合了 中断与异常的响应时机 和 异常处理后的返回行为,关键在于理解不同类别异常的恢复机制。
题目已明确:
- 异常:在当前指令执行过程中检测(同步);
- 中断:在当前指令执行结束后检测(异步);
进一步,某些异常处理完成后,需要重新执行引发异常的指令,而有些则继续执行下一条指令。
三类内部异常的返回行为:

本题考查的是:处理后必须回到“当前指令”重新执行 → 对应 故障类异常(Fault)
A. 系统调用:属于 自陷(Trap),是程序主动调用操作系统服务的机制;处理完成后,操作系统返回到下一条指令继续执行;不会重新执行系统调用指令本身。
B. 页缺失(缺页)✅ 正确。属于典型的 故障(Fault);
- 当前指令试图访问一个不在物理内存中的页面,CPU 暂停该指令执行,触发缺页异常;
- 操作系统将所需页面从磁盘调入内存,并更新页表;
- 处理完成后,CPU 回到引发缺页的那条指令重新执行,此时访问成功。
👉 必须重新执行原指令,符合题意。
C. DMA传送结束 ❌ 错误。是由外部设备(DMA控制器)发出的中断请求,属于外部中断;处理完成后,返回到下一条指令继续执行;并不涉及重新执行原指令。
D. 打印机缺纸 ❌ 错误。 打印机缺纸是外部设备状态变化,通过中断通知 CPU;属于外部中断;中断处理程序可能暂停打印任务、记录状态、通知用户;处理后,CPU 返回到被中断程序的下一条指令继续执行;原指令(如“输出字符”)不会重新执行,通常由应用层重试或等待恢复。不满足“重新执行当前指令”。
📌 答题技巧:
- 看到“必须回到当前指令重新执行” → 直接锁定 “故障”类异常;
- 常见故障:缺页、缺段、权限错误、总线错误等;
- 而“系统调用”“中断”等均返回下一条指令。
1.1.2.1 内部异常的分类¶
内部异常(exception)是指在CPU内部发生的意外事件或特殊事件。
- 按发生原因分为以下两类
- 硬故障中断: 如电源掉电、硬件线路故障等
- 程序性中断:
执行某条指令时发生的“例外(Exception)" 事件,如溢出、缺页、越界、越权、越级、非法指令、除数为0、堆/栈溢出、访问超时、断点设置、单步、系统调用等 - 按发生异常的报告方式和返回方式的不同 (处理方式),内部异常可分为
- 故障(
fault):执行指令引起的异常事件,如溢出、非法指令、缺页、访问越权等。“断点”为发生故障指令的地址 - 自陷(
trap) :预先安排的事件( "埋地雷”),如单步跟踪、断点、系统调用(执行访管指令)等。是一种自愿中断。“断点”为自陷指令下条指令地址(注意:当自陷指令是转移指令时,并不能返回到下一条指令执行,而是返回到转移目标指令执行) - 终止(
abort):硬故障事件,此时机器将“终止”,调出中断服务程序来重启操作系统。“断点”是什么?随便!
Note
【注意】:
- 在历年408考题以及袁书习题中,一般默认自陷指令完成后返回到下条指令执行。(可以这么理解,这里的下一条指令是广义上的下一条指令,即可以指顺序执行的下一条指令,也可以指下一条待执行的目标转移指令,反正不会是该自陷指令本身,否则会陷入死循环)
- 哪些故障补救后可继续执行,哪些只好终止当前进程?\ 缺页等:补救后可继续,回到发生故障的指令重新执行。
上溢出、除数为0、非法指令、内存保护错等: 终止当前进程。
1.故障
故障也称为失效,是指引起故障的指令在执行过程中,CPU检测到的一类与指令执行相关的意外事件。这种意外事件有些可以恢复,有些则不能恢复。
- 对于像溢出和非法操作码等这类故障,因为无法通过异常处理程序恢复,所以不能回到被中断的程序继续执行,通常异常处理程序在屏幕上显示一个对话框告知发生了某种故障,然后调用内核中的
abort例程,以终止发生故障的当前进程。
浮点数下溢,直接当作机器0处理,不会引起中断;浮点数上溢,表示超过了浮点数的表示范围,属于内部异常。
- 对于除数为0的情况,根据是定点除法指令还是浮点除法指令有不同的处理方式。
- 对于浮点数除0,异常处理程序可以选择将指令执行结果用特殊的值(如\(∞或NaN\))表示,然后返回到用户进程继续执行除法指令后面的一条指令;
- 对于整数除0,则会发生“整除0”故障,通常调用
abort例程来终止当前用户进程。 - 对于页故障,根据内存管理等知识可知,CPU在执行指令过程中需要访问存储器时,首先由
MMU进行地址转换,因此页故障事件由硬件(MMU)发现。以下几种情况都会发生“页故障”。 - 缺页:页表项有效位为0 ← 可通过读磁盘恢复故障
- 地址越界:地址大于最大界限 不可恢复, 称为“段故障(
segmentation fault) " - 访问越级或越权(保护违例) : 不可恢复, 称为“段故障(
segmentation fault) "- 越级:用户进程访问内核数据(
CPL=3 / DPL=0) - 越权:读写权限不相符(如对只读段进行了写操作)
- 越级:用户进程访问内核数据(
一个页故障的实例:(袁春风《计算机系统基础》P334)
假设在IA-32+Linux系统中一个C语言源程序P如下:
int a[1000];
int x;
void main()
{
a[10] = 1;
a[1000] = 3;
a[10000] = 4;
}
假设经过编译、汇编和链接以后,第5、6和7行源代码对应的指令序列如下:
外部原图已失效:image-20230702121931471.png
已知系统采用分页虚拟存储管理方式,页大小为4KB。若在运行P对应的进程时,系统中没有其他进程在运行,则对于上述三条指令的执行,在取指令时是否可能发生页故障?在数据访问时分别会发生什么问题?哪些问题是可恢复的?哪些问题是不可恢复的?
解:对于上述三条指令的执行,访问指令时都不会发生缺页,因为在执行这些指令之前,一定执行过其他位于这些指令前面的指令,它们都位于起始地址为0x08048000(是一个4KB页面的起始位置)的同一个页面,所以,在执行这三条指令之前,它们已经随着前面某条指令一起被装入了内存。因为没有其他进程在系统中运行,所以不会因为执行其他进程而使得调入主存的页面被调出到磁盘。综上所述,执行到这三条指令时,都不会在取指令时发生页故障。
对于第5行对应指令的执行,数据访问时会发生缺页异常,但是是可恢复的故障。因为,对于地址为0x8049028的a[10]的访问,是对所在页面(起始地址为0x08049000,是一个4KB页面的起始位置)的第一次访问,因而对应页面不在主存。当CPU执行到该指令时,检测到缺页异常,即发生了页故障,此时,CPU暂停用户进程P的执行,将控制转移到操作系统内核,调出内核中的“页故障处理程序”执行。在页故障处理程序中,检查是否地址越界或访问越权,显然这里没有发生越界和越权情况,故将地址0x8049028所在页面从磁盘调入内存,处理结束后,再回到这条movl指令重新执行,此时,再访问数据就没有问题了。处理过程如图所示。
外部原图已失效:113B5E86F4316C371899393C6F3EA5C0.png
对于第6行对应指令的执行,数据访问时不会发生缺页,因为在执行上一条指令时,已经将起始地址为0x8049000页面装入了内存,而地址0x8049fa0位于该页面中,因而不会缺页。但是,因为数组a只有1000个元素,即a[0]~a[999],所以a[1000]并不存在。不过,C编译器可能不会检查数组边界,因而生成了第6行对应的指令“movl $0x3,0x8049fa0”,其中的地址0x8049fa0有可能是x的地址而不是a[1000]的地址,即在该指令执行前,地址0x8049fa0中可能存放的是0(对x初始化为0),该指令执行后,不知不觉地将地址0x8049fa0中原来的0换成了3。
对于第7行对应指令的执行,数据访问时很可能会发生页故障,而且是不可恢复的故障。显然,a[10000]并不存在,不过,C编译器可能会生成第7行对应的指令“movl$0x4,0x8052c40”,其中的地址0x8052c40偏离数组所在页首地址0x8049000已达4×10000+4=40004个单元,即偏离了9个页面,很可能超出了可读写数据区范围,因而当CPU执行该指令时,很可能发生地址越界或访问越权。若是这样的话,CPU就通过异常响应机制转到操作系统内核,即调出内核中的页故障异常处理程序执行。在页故障处理程序中,检测到发生了地址越界或访问越权,因而页故障处理程序发送一个“段错误”信号(SIGSEGV)给用户进程,用户进程接收到该信号后就调出对应的信号处理程序执行。处理过程如图所示:
外部原图已失效:53D5535DF05E75829A43A2BB0BF70C3E.png
- 自陷
陷阱也称为自陷或陷入,与“故障”等其他异常事件不同,是预先安排的一种“异常”事件,就像预先设定的“陷阱”一样。当执行到陷阱指令(也称为自陷指令)时,CPU就调出特定的程序进行相应的处理,处理结束后返回到陷阱指令的下一条指令执行。其处理过程如图7.12所示。

陷阱的重要作用之一是在用户程序和内核之间提供一个像过程一样的接口,这个接口称为系统调用,用户程序利用这个接口可以方便地使用操作系统内核提供的一些服务。操作系统给每个服务编一个号,称为系统调用号,每个服务功能通过一个对应的系统调用服务例程提供。
为了使用户程序在需要调用内核服务功能的时候,能够从用户态转到对应的系统调用执行,处理器会提供一个或多个特殊的系统调用指令,如IA-32处理器中的sysenter指令、MIPS处理器中的syscall指令等。这些系统调用指令属于陷阱指令,当执行到这些指令时,CPU通过一系列步骤自动调出内核中对应的系统调用服务例程执行。
此外,利用陷阱机制可以实现程序调试功能,包括设置断点和单步跟踪。
IA-32中,当CPU处于单步跟踪状态(
TF=1且IF=1) 时,每条指令都被设置成了陷阱指令,执行每条指令后,都会发生中断类型号为1的”调试”异常,从而转去执行"单步跟踪处理程序”【注意】:对于“单步跟踪”这类陷阱,当陷阱指令是转移指令时,处理后不能返回到转移指令的下条指令执行,而是返回到
转移目标指令执行。
在IA-32中,陷阱指令引起的异常称为编程异常(programmed exception),这些指令包括INTn、int3、into(溢出检查)、bound(地址越界检查)等。通常将INTn称为软中断指令,执行该指令引起的“异常”通常也称为软中断(software interrupt)。
- 终止
如果在执行指令过程中发生了使机器无法继续执行的硬件故障,如电源掉电、线路故障、控制器出错、存储器校验错等,则程序无法继续执行,只好终止,此时,调出中断服务程序来终止发生问题的进程,甚至要重启系统。这种异常与故障和自陷不同,不是由特定指令产生的,而是随机发生的。

【注】:故障异常和自陷异常属于
程序性异常(软件中断);而终止异常和外中断属于硬件中断。
1.1.2.2 外部中断的分类¶
程序执行过程中,若外设完成任务或发生某些特殊事件(如打印机缺纸、定时采样技术时间到、键盘缓冲满等),会向CPU发中断请求,要求CPU对这些情况进行处理。所以说中断是由外部I/O设备请求处理器进行处理的一种信号,它不是由当前执行的指令引起的。外部I/O设备通过特定的中断请求信号线向CPU提出中断申请。
CPU在执行指令的过程中,每执行完一条指令就查看中断请求引脚,如果中断请求引脚的信号有效,则进入中断响应周期。在中断响应周期中,CPU先将当前PC值(称为断点)和当前的机器状态保存到栈中,并设置成“关中断”状态,然后,从 数据总线 读取 中断类型号,根据中断类型号跳转到对应的中断服务程序执行。中断响应过程由硬件完成,而中断服务程序执行具体的中断处理工作,中断处理完成后,再回到被打断程序的“断点”处继续执行。中断的整个处理过程如图7.14所示。\
Intel将外部中断分成可屏蔽中断(maskable interrupt,INTR)和不可屏蔽中断(nonmaskable interrupt,NMI)。

- 可屏蔽中断
可屏藏中断是指通过可屏蔽中断请求线INTR向CPU进行请求的中断,主要来自I/O设备的中断请求。CPU可以通过在中断控制器中设置相应的屏蔽字来屏蔽它或不屏蔽它,若一个I/O设备的中断请求被屏蔽,则它的中断请求信号将不会被送到CPU。一般外设中断源引起的中断都是可屏蔽中断。
- 不可屏蔽中断
不可屏蔽中断通常是非常紧急的硬件故障,通过专门的不可屏蔽中断请求线NMI向 CPU发出中断请求。如:电源掉电,时钟中断、硬件线路故障等,这类中断请求信号一旦产生,任何情况下它都不可以被屏蔽,因此一定会被送到CPU,以便让CPU快速处理这类紧急事件。通常,这种情况下,中断服务程序会尽快保存系统重要信息,然后在屏幕上显示相应的消息或直接重启系统。
1.2 中断的工作过程¶

现代计算机系统中都配有完善的异常和中断处理系统,CPU的数据通路中有相应的异常和中断的检测和响应逻辑,在外设接口中有相应的中断请求和控制逻辑,操作系统中有相应的中断服务程序。这些中断硬件线路和中断服务程序有机结合,共同完成异常和中断的处理过程。
Note
为什么中断检测不能像异常一样在指令执行中进行?而是等到指令执行结束才检测?
- 中断是由外部设备(如键盘、网络接口等)或内部定时器发出的,通常是异步发生的,不与当前正在执行的指令同步。由于中断请求是随机且异步的,因此CPU只能在指令执行完成后进行中断检测,如果在指令执行过程中插入中断检测会破坏指令的原子性,增加处理的复杂性。
- 为了保持指令执行的完整性和一致性,CPU设计成在一条指令执行结束后才检查是否有中断请求。这确保了指令在执行过程中不会被中断,从而避免了在中断处理完后难以恢复到被中断指令的中间状态的问题。
- 而异常是由当前指令执行过程中发生的错误或特殊情况引起的,例如除零错误、无效内存访问或特权指令错误。它们是同步的,与当前指令的执行过程紧密相关。CPU可以在指令执行过程中检测到异常并立即响应,这是因为异常发生的时刻和引发它的指令是明确的,处理完成后可以准确地恢复或重新执行这条指令。
CPU为什么在一条指令执行结束后才检查中断请求的详细解释
【指令的原子性与一致性】
- 指令的原子性:
- 一条指令被设计为一个不可分割的操作单元,即指令从开始到结束应当完整地执行。这种原子性确保了程序执行的预期行为和结果。
- 如果在指令执行过程中发生中断,指令被部分执行,可能导致不可预期的行为或错误,破坏程序的正确性。
- 指令执行阶段:
- 指令执行通常包括多个阶段:取指(Fetch)、间址(Decode)、执行(Execute)、存储(Memory)、写回(Write Back)。
- 在任意阶段中断指令执行,都会导致状态不一致。例如,一条加载指令(Load)可能已经取到了内存地址,但还没有完成数据读取并存储到寄存器。
【中断处理与恢复的复杂性】
- 中断处理机制:
- 中断发生时,CPU需要保存当前执行状态(如程序计数器、寄存器内容等),跳转到中断服务程序执行中断处理。
- 中断处理完成后,CPU需要恢复保存的状态,继续执行被中断的指令。
- 恢复被中断指令的中间状态的困难:
- 如果在指令执行的中间阶段发生中断,CPU必须保存指令执行的部分状态。恢复时,CPU需要恢复到指令执行的中间阶段,并继续执行剩余部分。这种中间状态的保存和恢复是复杂且容易出错的。
- 例如,一条复杂的指令可能需要多个时钟周期才能完成。如果在中间阶段中断,恢复时需要精确到具体的微操作,这在硬件设计和实现上增加了很大的复杂性和不确定性。
【设计策略】
- 整条指令的执行完整性:
- 为了避免上述复杂性和潜在的错误,CPU设计为在一条指令完整执行结束后才检查并响应中断。这种策略确保了指令的原子性和程序执行的一致性。
- 当一条指令执行完毕,CPU的状态是稳定且一致的,此时保存当前状态并处理中断,然后恢复后执行下一条指令,能确保程序继续按照预期运行。
- 中断周期的合理性:
- 在指令结束后的中断周期进行中断处理,简化了中断处理的逻辑。只需保存完整的CPU状态,不需要考虑指令执行到一半的复杂场景。
- 这种设计使得硬件和软件的实现更为简单、可靠,确保系统的稳定运行。
所以为了保持指令执行的完整性和一致性,CPU设计在指令执行结束后才检查中断请求。这种设计避免了在指令中间状态下处理中断的复杂性和潜在的错误,确保程序的正确执行和系统的稳定性。
【2023-21】下列关于硬件和异常/中断关系的叙述中,错误的是( )。
A. CPU 在执行一条指令过程中检测异常事件
B. CPU 在执行完一条指令时检测中断请求信号
C. 开中断中 CPU 检测到中断请求后就进行中断响应
D. 外部设备通过中断控制器向 CPU 发中断结束信号
解析
答案:D
A. CPU 在执行一条指令过程中检测异常事件
- 异常(如除零、非法指令、缺页、地址越界等)是同步事件,由当前执行的指令引发。
- CPU 在指令执行的各个阶段(取指、译码、执行、访存)会实时检测异常条件。
- 例如:执行除法指令时,若除数为0,在“执行”阶段立即触发异常。
- 因此,异常的检测发生在指令执行过程中,具有同步性。👉 正确。
B. CPU 在执行完一条指令时检测中断请求信号 👉 正确。
- 外部中断是异步事件,但 CPU 不能在指令执行中途响应中断。
- 为了保证指令执行的原子性,CPU 只在每条指令执行结束后,检查是否有有效的中断请求(且 IF=1)。
C. 开中断中 CPU 检测到中断请求后就进行中断响应 ✅ 正确。
- 当 CPU 处于开中断状态(IF=1)且当前指令执行完毕时,若检测到有效的可屏蔽中断请求,将立即启动中断响应流程。 (即便是多重中断,CPU正在处理某个中断的过程中,由于中断屏蔽字的存在,CPU检测不到处理优先级更低的中断请求信号,若检测到中断请求信号,则说明其处理优先级更高,会立即响应。)
- 注意:
- 需要注意有些同学可能觉得检测到了就响应这个点有错,但是要注意,CPU 是会等到指令执行完毕才会去检测中断请求,“立即响应”是指在当前指令结束后立即响应,并非“执行中途”;
D. 外部设备通过中断控制器向 CPU 发中断结束信号 ❌ 错误 —— 本题选 D。
关键误解:谁发送“中断结束信号”?
- 外部设备不会直接或间接向 CPU 发送“中断结束信号”。
- 实际流程如下:
- 外设产生中断请求 → 通过中断控制器向 CPU 发送
INTR信号; - CPU 响应中断,执行中断服务程序(ISR);
- 在 ISR 结束前,由软件(操作系统)向中断控制器发送“中断结束命令”(EOI, End of Interrupt);
- 中断控制器收到 EOI 后,清除当前中断状态,允许后续中断。
👉 “中断结束”是由 CPU(通过软件)通知中断控制器,而不是外设或控制器主动发给 CPU。
因此,D 项说“外部设备通过中断控制器向 CPU 发中断结束信号”方向完全颠倒,是错误的。
1.2.1 中断请求¶
中断源是请求CPU中断的设备或事件,一台计算机允许有多个中断源。每个中断源向CPU发出中断请求的时间是随机的。为记录中断事件并区分不同的中断源,中断系统需对每个中断源设置中断请求标记触发器,当其状态为“1”时,表示中断源有请求。这些触发器可组成中断请求标记寄存器,该寄存器可集中在CPU中,也可分散在各个中断源中。\
通过INTR线发出的是可屏蔽中断,通过NMI线发出的是不可屏蔽中断。可屏蔽中断的优先级最低,在关中断模式下不会被响应。通过NMI线请求的不可屏蔽中断用于处理紧急和重要的事件,如时钟中断、电源掉电等,其优先级最高,其次是内部异常,即使在关中断模式下也会被响应。

此外,CPU总是在指令执行阶段的最后时刻,自动检测中断请求引脚,发现有中断请求时,则根据情况决定是否响应和响应哪个中断请求。
关于通过
NMI线传送的非屏蔽中断
NMI通常用于处理紧急情况,如硬件故障、系统崩溃、关键资源的异常状态等。由于其紧迫性,NMI通常具有比其他中断更高的优先级。当NMI发生时,处理器会立即跳转到一个特定的中断处理程序,这个程序与常规中断处理程序不同。NMI处理程序通常很短,只包含必要的代码来响应紧急情况。- 由于不可屏蔽中断的特殊性,几乎所有触发
NMI的事件对处理器来说都是致命的,也不可恢复。所以这种情况下,就没有抢救的必要了。处理器不屏蔽来自NMI的中断请求。处理器在响应NMI中断时,它通常不需要像常规中断那样从外部硬件获取中断向量号。在很多处理器中,不可屏蔽中断所对应的中断向量号固定为2(因此它在被响应时无中断响应周期)。- 当处理器接收到
NMI后,它会在内部屏蔽进一步的NMI,以避免在处理当前紧急情况时被其他NMI打断。这种屏蔽会持续到执行中断返回指令(例如IRET)为止。这是一种确保中断处理程序能够安全、完整地执行的机制。

【条件码】:
OF (Overflow Flag)溢出标志。溢出时为1,否则置0。
SF (Sign Flag)符号标志。结果为负时置1,否则置0.
ZF (Zero Flag)零标志,运算结果为0时ZF位置1,否则置0.
CF (Carry Flag)进位标志,进位时置1,否则置0.
AF (Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。有进位时1,否则置0.
PF (Parity Flag)奇偶标志。结果操作数中1的个数为偶数时置1,否则置0.【控制标志位】:
DF (Direction Flag)方向标志,在串处理指令中控制信息的方向。
IF (Interrupt Flag)中断标志。
TF (Trap Flag)陷阱标志(是否是单步跟踪状态)。
1.2.2 中断判优¶
【2018-22】下列关于外部I/O中断的叙述中,正确的是( )。\ A. 中断控制器按所接收中断请求的先后次序进行中断优先级排队\ B. CPU响应中断时,通过执行中断隐指令完成通用寄存器的保护\ C. CPU只有在处于中断允许状态时,才能响应外部设备的中断请求\ D. 有中断请求时,CPU立即暂停当前指令执行,转去执行中断服务程序
解析
答案:C
A. 中断控制器按所接收中断请求的先后次序进行中断优先级排队 ❌ 错误
- 中断控制器对中断请求的排队不是按“先来先服务”,而是依据预设的优先级机制;
- 优先级可以是:
- 固定优先级(如
);
- 轮询优先级;
- 动态优先级(通过中断屏蔽字设置);
- 因此,即使
先于
发出请求,若
优先级更高,仍会先响应
。
👉 中断排队依据优先级而非时间先后,A项错误。
B. CPU响应中断时,通过执行中断隐指令完成通用寄存器的保护 ❌ 错误
⚠️ 通用寄存器(如 R0~R7、AX、BX 等)的保护:不由硬件完成;而是由中断服务程序中的软件代码(通常为汇编或内核代码)显式压栈保存;属于“保护现场”的一部分,由操作系统负责。
C. CPU只有在处于中断允许状态时,才能响应外部设备的中断请求 ✅ 正确
- 可屏蔽中断的响应受中断允许标志位(IF, Interrupt Flag) 控制;
- 只有当 IF = 1(开中断) 时,CPU 才会响应可屏蔽中断请求;
- 若 IF = 0(关中断),即使有中断请求,CPU 也会忽略;
- 这是实现中断屏蔽和临界区保护的基础机制。
⚠️ 注意:此规则仅针对可屏蔽中断;不可屏蔽中断(NMI) 不受 IF 影响。
D. 有中断请求时,CPU立即暂停当前指令执行,转去执行中断服务程序 ❌ 错误
- CPU 不会在指令执行中途响应中断;
- 响应中断的时机是:当前指令执行结束后,且满足:
- 有中断请求;
- IF = 1;
- 无更高优先级事件(如 NMI、DMA)正在处理;
- 这是为了保证指令执行的原子性和系统稳定性。
👉 “立即暂停”意味着打断正在执行的指令,这在大多数体系结构中是不允许的。此外执行中断服务程序之前还需要执行中断隐指令;D项错误。
任何一个中断系统,在任一时刻,只能响应一个中断源的请求。但许多中断源提出请求都是随机的,当某一时刻有多个中断源提出中断请求时,中断系统必须按其优先顺序予以响应,这称为中断判优。各中断源的优先顺序是根据该中断源若得不到及时响应,致使机器工作出错的严重程度而定的。例如,电源掉电对计算机工作影响程度最大,优先等级为最高。又如“定点溢出”对机器正常工作影响也很大,若不及时响应,将使计算机一切运行均无效,故它的优先等级也较高。对于I/O设备,则可按其速度高低安排优先等级,速度高的设备优先级比速度低的设备高。
- ①不可屏蔽中断>内部异常>可屏蔽中断;
- ②内部异常中,硬件故障>软件中断;
- ③DMA中断请求优先于I/O设备传送的中断请求;
- ④在I/O传送类中断请求中,高速设备优先于低速设备,输入设备优先于输出设备,实时设备优先于普通设备。
中断判优可用硬件实现,也可用软件实现。(唐书P361)
- 硬件排队又分两种。一种为链式排队器,对应中断请求触发器分散在各个接口电路中的情况,如下左图所示,每一个接口电路中都设有一个非门和一个与非门,它们犹如链条一样串接起来。另一种排队器设在CPU内,如下右图所示,图中假设其优先顺序按1、2、3、4由高向低排列。这样,当最高优先级的中断源有请求时
INTR =1,就可封住比它级别低的中断源的请求。


- 另一种为硬件判优方法(向量中断法):根据中断控制器接口(
PIC)中的中断判优电路和编码器等, 得到当前所有未被屏蔽的中断请求中具有最高响应优先权的中断源类型(即中断源标识信息)。 例如IRQi中的i就是中断源标识信息, 通过编码器输出的i最终被送到 CPU 中, CPU 根据i的值找到对应的中断服务程序的首地址PC和初始PSW。\

- 软件排队:软件排队是通过编写查询程序实现的,其程序图如下所示。当CPU检测到中断请求时,程序按中断源的优先等级,从高至低逐级查询各中断源是否有中断请求,这样就可以保证CPU首先响应级别高的中断源的请求。

对于这种用软件进行中断识别的方式,其中断接口的硬件结构很窗单,只要一根中断请求线和一个中断请求寄存器,而且,可通过改变软件中的查询顺序来改变中断响应优先级,因而比较灵活。但是,因为软件查询速度慢,因而中断请求可能无法得到实时响应。
1.2.3 异常和中断的响应¶
【2012-22】响应外部中断的过程中,中断隐指令完成的操作,除保护断点外,还包括( )。
Ⅰ. 关中断
Ⅱ. 保存通用寄存器的内容
Ⅲ. 形成中断服务程序入口地址并送PC
A. 仅Ⅰ、Ⅱ
B. 仅Ⅰ、Ⅲ
C. 仅Ⅱ、Ⅲ
D. Ⅰ、Ⅱ、Ⅲ
解析
答案:B
在响应外部中断的过程中,中断隐指令完成的操作包括:①关中断,②保护断点,③引出中断服务程序(形成中断服务程序入口地址并送PC),所以只有Ⅰ、Ⅲ正确。Ⅱ中的保存通用寄存器的内容是进入中断服务程序后首先进行的操作。
响应时间:每条指令的执行周期结束的时候(单指外中断,内部异常和不可屏蔽中断不受该限制)
流水线数据通路中,分析在以下这些情况下,CPU在哪些指令的哪个时钟周期能分别检测到这些异常和中断?
a.“除数为0”异常在取数/译码(ID/Reg)周期进行检测
b.“溢出”异常在R-Type指令的执行(Exe)周期进行检测
c.“无效指令”异常在取数/译码(ID/Reg)周期进行检测
d.“无效指令地址”、“缺页”和“访问越权”异常在取指令(IF)周期检测
e.“无效数据地址”、“缺页”和“访问越权”异常在存储器访问(Mem)周期检测
f.“中断”可在每条指令的最后一个周期(WB)的最后进行检测
CPU响应中断必须要满足以下3个条件:
- 至少有一个未被屏蔽的中断的请求;(中断请求触发器
INTR被置“1”,标志设备向CPU提出中断请求,同时INTR送⾄排队器,进⾏中断判优) - CPU允许中断且处于开中断状态 (异常和不可屏蔽中断不受此限制)即中断允许触发器
EINT被置为1 - 当前指令执行完毕(异常不受此限制),且没有更紧急的任务。
- 异常和中断响应过程:
异常和中断的响应是指主机发现中断请求或异常事件,中止现行程序的执行,到调出相应的异常或中断处理程序这一过程,因此,中断响应过程是处理器从一个进程切换到另一个进程(具体的处理特殊事件的内核程序)的过程。
CPU响应中断后,即进入中断响应周期。在中断响应周期内,CPU要完成一系列操作,这些操作是由硬件直接实现的,我们将它称为中断隐指令。中断隐指令并不是指令系统中的一条真正的指令,只是一种虚拟的说法,本质上是硬件的一系列自动操作。它所完成的操作如下:
- 当发生特权级切换,即CPU特权级由用户态切换为内核态时,会触发用户堆栈切换为内核堆栈;(硬件自动完成特权级和堆栈的切换,不必了解原理)
- 用户程序响应中断后必然涉及到特权级的切换,用户栈切换到内核栈的过程同样在这一步完成,该步骤由硬件实现;
- 在中断处理的过程中,如果来了优先级更高的中断请求,且符合响应该中断的条件,则会转去处理该中断请求,此时没有发生特权级的切换。
①关中断。CPU 响应中断后,首先要保护程序的断点和现场信息,在保护断点和现场的过程中,CPU不能响应更高级中断源的中断请求。否则,若断点或现场保存不完整,在中断服务程序结束后,就不能正确地恢复并继续执行现行程序。通常通过设置==“中断允许位”(中断允许触发器)==来屏蔽掉所有可屏蔽中断请求。
- 若中断允许位置1,则为开中断,表示允许响应中断;若置0,则为关中断;在IA-32中,“中断允许位“就是
EFLAGS寄存器(PSWR)中的中断标志位IF- 除了在中断响应阶段可以由CPU对中断允许位进行设置外,也可以在异常或中断处理程序中执行相应的指令来设置或清除中断允许位。在IA-32中,可通过执行特权指令
sti或cli,将标志寄存器EFLACS中的IF位置1或清0,以使CPU处在开中断或关中断状态。
②保存断点。为保证在中断服务程序执行完后能正确地返回到原来的程序,必须将原程序的断点(指令无法直接读取的PC和PSW的内容)自动保存在栈或特定寄存器中。
【注】
- 注意异常和中断的差异:中断的断点一般是下一条指令的地址。而异常指令通常并没有执行成功,异常处理后要重新执行或直接终止,所以对于不同的异常事件,其返回地址(即断点不同)。对于不同的异常事件,其返回地址(即断点)不同。例如,"缺页故障"异常的断点是发生页故障的当前指令的地址;"陷阱"异常的断点则是陷阱指令后面一条指令的地址。显然,断点与异常类型有关。
- 如果在执行某些指令(例如
lw/sw)指令时发生了“缺页”异常,在进行相应的处理将所需页面调入内存后,显然需要回到发生缺页的指令再执行一遍,因而其断点值应该是当前PC值减去后面那条指令的长度。因为在发生“缺页”时,已在取指令状态执行了PC+“1”,所以需要减去“1”才能重新执行发生异常的指令。- 为了能够支持异常或中断的嵌套处理,大多数处理器将断点保存在栈中,如80x86处理器的断点被保存在栈中。如果系统不支持多重中断嵌套处理,则可以将断点保存在特定寄存器中,而不需送到栈保存,如MIPS处理器用EPC寄存器专门存放断点。后者开销较小,因为访问栈就是访问存储器,比访问寄存器耗时要长。
- 因为异常处理后可能还要回到原被中断的程序继续执行,所以,被中断时原程序的状态(如产生的各种标志信息、允许自陷标志等)都必须保存起来。通常每个正在运行程序的状态信息存放在一个专门的寄存器中,这个专门寄存器统称为程序状态字寄存器(
PSWR),存放在PSWR中的信息称为程序状态字(Program Status Word,PSW)。与返回地址(即断点)一样,PSW也要被保存在栈或特定寄存器中。
③识别异常或中断事件并转相应的处理程序执行。
一般来说,内部异常事件和外部中断源的识别方式不同,大多数处理器会将两者分开来处理。
- 内部异常事件的识别很简单, 只要CPU在执行指令时把检测到的事件对应的异常类型号或标识异常类型的信息记录到特定的内部寄存器中即可。
- 外部中断源的识别比较复杂。由于外部中断的发生与CPU当前执行指令无关,因此并不能根据指令执行过程中的某些现象来判断是否发生了“中断”请求。对于外部中断,只能在每条指令执行完后、取下条指令之前去查询是否有中断请求。通常CPU通过采样对应的中断请求引脚(如Intel处理器的
INTR)来进行查询。如果发现中断请求引脚有效,则说明有中断请求,但是,到底是哪个I/O设备发出的请求,还需要进一步识别。通常是由CPU外部的
中断控制器根据I/O设备的中断请求和中断屏蔽情况,结合中断响应优先级,来识别当前请求的中断类型号,并通过数据总线将中断类型号送到CPU。异常和中断源的识别可以采用
软件识别或硬件识别两种方式。
软件识别方式是指,CPU中设置一个原因(Cause)寄存器,该寄存器中有一些标识异常原因或中断类型的标志信息。操作系统使用一个统一的异常或中断查询程序,该程序按一定的优先级顺序查询原因寄存器,先查询到的先被处理。然后转到内核中相应的异常处理程序或中断服务程序进行具体的处理。逻辑跟上面的软件排优一样。- 硬件识别方式称为
向量中断方式。这种方式下,异常或中断处理程序的首地址PC和初始PSW被称为中断向量(Interrupt Vector),所有中断向量存放在一个表中,称为中断向量表。每个异常和中断都被设定一个中断类型号,中断向量存放的位置与对应的中断类型号相关,例如,类型0对应的中断向量存放在第0表项,类型1对应的中断向量存放在第1表项,以此类推,因而可以根据类型号快速找到对应的处理程序。
CPU响应中断后,通过识别中断源获得中断类型号,然后据此计算出对应中断向量的地址(
VA,Vector Address);再根据该地址从中断向量表中取出中断服务程序的入口地址(即中断向量),并送入程序计数器 PC,以转而执行中断服务程序。
1.2.4 中断服务程序(软件实现)¶
【2010-21】单级中断系统中,中断服务程序内的执行顺序是()。
Ⅰ保护现场 Ⅱ开中断 Ⅲ 关中断 Ⅳ保护断点 Ⅴ中断事件处理 Ⅵ 恢复现场 Ⅶ 中断返回
A. Ⅰ→Ⅴ→Ⅵ→Ⅱ→Ⅶ
B. Ⅲ→Ⅰ→Ⅴ→Ⅶ
C. Ⅲ→Ⅳ→Ⅴ→Ⅵ→Ⅶ
D. Ⅳ→Ⅰ→Ⅴ→Ⅵ→Ⅶ
解析
答案:A
一般中断服务程序的流程为:保存现场和屏蔽字→开中断→执行中断服务程序→关中断→恢复现场和屏蔽字→开中断→中断返回。
单级中断系统不允许中断嵌套,去掉执行中断服务程序前后的开中断和关中断。
中断处理过程为:保存现场→中断事件处理→恢复现场→开中断→中断返回。
【2015-23】处理外部中断时,应该由操作系统保存的是( )。
A. 程序计数器 (PC) 的内容
B. 通用寄存器的内容
C. 快表 (TLB) 中的内容
D. Cache中的内容
解析
答案:B
在处理外部中断时,CPU需要暂停当前程序的执行,转去执行中断服务程序(ISR)。为保证中断处理结束后能正确恢复原程序的执行,必须保存当前程序的执行上下文(即“现场”)。
A. PC(程序计数器)保存的是下一条将要执行的指令地址。在中断响应过程中,PC 的内容由硬件自动保存(通常压入系统栈或特定寄存器),这是“中断隐指令”完成的操作。
B. 通用寄存器的内容(如 R0~Rn、AX、BX 等)保存的是程序运行时的中间数据和变量。这些寄存器可能被中断服务程序修改,因此必须在进入中断服务程序后,由操作系统(通过中断服务程序)显式保存到内存(如内核栈)中,称为“保护现场”。处理完成后,再由操作系统恢复这些寄存器的值,称为“恢复现场”。因此 B 正确。
C. 快表 (TLB) 中的内容, 错误。
TLB是 MMU 中的高速缓存,用于加速虚拟地址到物理地址的转换。
TLB 内容是动态维护的,由硬件和操作系统协作管理,但在单次中断处理过程中,不需要专门保存和恢复 TLB 内容。因为中断不会发生地址空间的切换,进程切换才会切换进程地址空间,需要切换页表基址寄存器 PTBR 的内容,而 TLB 的内容也无需保存,因为其本来就是内存中页表的副本,进程切换后,把 TLB 里的内容冲刷即可 (把有效位都清 0)
D. Cache 中的内容❌ 错误。
Cache 是 CPU 的高速缓存,用于提升访存速度。其内容是主存的副本,由硬件自动管理,具有透明性。
中断处理期间,无需、也无法由操作系统“保存”Cache 内容。(Cache 对 OS 来说是透明的)
Cache 一致性由硬件或内存屏障指令维护,不涉及中断上下文保存。
④保存现场和屏蔽字。进入中断服务程序后首先要保存现场和中断屏蔽字,现场信息是指用户可见的工作寄存器的内容,它存放着程序执行到断点处的现行值。

为了保证被中断程序在从中断服务程序返回后在断点处能继续正确执行下去,有两类信息不能被中断服务程序破坏。
- 一类是用户可见的工作寄存器的内容,如通用寄存器等,这些工作寄存器存放着程序执行到断点处的现行值,一般把这类信息称为现场; (屏蔽字寄存器也是由OS负责保存,但是用户不可见,在内核态下和通用寄存器等现场信息一起被OS保存,因此对OS可见)
- 另一类是用指令无法直接读取的程序计数器 PC和程序状态字寄存器
PSWR等的内容,通常把这类信息称作断点信息。\ 对于现场信息,因为是用指令可直接访问的,所以通常在中断服务程序中通过指令把它们保存到栈中,即由软件实现;而对于断点信息,因为必须将中断服务程序的首地址和初始程序状态字装入到PC和PSWR中才能转到中断服务程序执行,所以,原来在PC和PSWR中的断点信息应由处理器在中断响应开始时自动保存到一个特定的地方(栈或专门寄存器),即由硬件实现。
⑤开中断。允许更高级中断请求得到响应,实现中断嵌套。
⑥执行中断服务例程。这是中断请求的目的,对于不同的中断请求源,其中断服务操作的内容是不同的,例如在程序I/O中,就是输入/输出数据。
⑦关中断。保证在恢复现场和屏蔽字时不被中断,与⑤搭配使用。
⑧恢复现场和屏蔽字。将现场和屏蔽字恢复到原来的状态。
⑨开中断
⑽返回断点。中断服务程序的最后一条指令通常是一条中断返回指令IRET,使其返回到原程序的断点处,以便继续执行原程序。

【注意】
- 图中的“保护现场和旧屏藏字”和“恢复现场和旧屏蔽字”分别通过“压栈”和“出栈”指令或取数指令来实现,“设置新屏蔽字”和“清除中断请求”通过执行I/O指令来实现,这些I/O指令将对可编程中断控制器(
PIC)中的中断请求寄存器和中断屏蔽字寄存器进行访问,以使这些寄存器中相应的位清0或置1。- 恢复现场是指在中断返回前,必须将寄存器的内容恢复到中断处理前的状态,这部分工作由中断服务程序完成。中断返回由中断服务程序的最后一条中断返回指令完成。
- CPU在执行
IRET指令的过程中完成以下工作:- 从内核栈中弹出
EIP、CS和EFLAGS,恢复断点和程序状态。- 检查当前异常或中断处理程序的CPL是否等于CS中最低两位,若是,则说明异常或中断响应前后都处于同一个特权级,
IRET指令完成操作;否则,再继续完成下一步工作。- 从内核栈中弹出SS和ESP,以恢复到异常或中断响应前的特权级进程所使用的栈。简而言之,若该指令返回了用户程序,则会将CPU特权级由内核态改回用户态,并完成堆栈切换和一些其他寄存器的恢复。\ 显然,执行完
IRET指令后,CPU自然回到原来发生异常或中断的进程继续执行。在设备驱动程序和中断服务程序中使用到的I/O指令以及“开中断”和“关中断”指令都是特权指令,只能在操作系统内核程序中使用。
1.2.5 多重中断和中断屏技术¶
【2017-22】下列关于多重中断系统的叙述中,错误的是( )。\ A. 在一条指令执行结束时响应中断\ B. 中断处理期间 CPU 处于关中断状态\ C. 中断请求的产生与当前指令的执行无关\ D. CPU 通过采样中断请求信号检测中断请求
解析
答案:B
本题考查 多重中断系统(即支持中断嵌套的系统)中,中断的响应机制与 CPU 状态管理。关键在于理解:是否允许在处理一个中断时响应更高优先级的中断
A. 在一条指令执行结束时响应中断 ✅ 正确。为了保证指令执行的原子性,CPU 不会在指令执行中途响应中断;而是在每条指令执行结束后,统一检测是否有中断请求(且 IF=1);这是所有中断系统的基本原则,无论是单级还是多重中断。
B. 中断处理期间 CPU 处于关中断状态 ❌ 错误 —— 本题选 B
- 在 单级中断系统 中,通常在进入中断服务程序后保持关中断(IF=0),不允许嵌套;
- 但在 多重中断系统(支持中断嵌套)中,设计目标就是允许高优先级中断打断低优先级中断;
- 实现方式是:
- 进入中断服务程序后,先保护现场(此时可关中断);
- 随后开中断(IF=1),允许更高优先级的中断请求被响应;
- 若此时有更高优先级中断到来,CPU 可再次响应,实现嵌套。
C. 中断请求的产生与当前指令的执行无关 ✅ 正确。
- 中断是异步事件,由外部设备(如定时器、键盘、网卡)发起;其发生时间与 CPU 当前执行哪条指令没有因果关系;
- 例如:打印机完成打印发出中断,与 CPU 正在执行加法还是跳转无关。这正是中断与异常(同步)的根本区别。
D. CPU 通过采样中断请求信号检测中断请求 ✅ 正确。
- CPU 并不持续响应中断,而是在特定时机(如指令结束)对中断请求线(如 INTR)进行电平或边沿采样;
- 若检测到有效中断请求,且满足响应条件(IF=1),则进入中断响应流程;这是硬件实现中断检测的标准机制。
【2021-22】下列是关于多重中断系统中 CPU 响应中断的叙述,其中错误的是( )。
A. 仅在用户态(执行用户程序)下,CPU 才能检测和响应中断
B. CPU 只有在检测到中断请求信号后,才会进入中断响应周期
C. 进入中断响应周期时,CPU 一定处于中断允许(开中断)状态
D. 若 CPU 检测到中断请求信号,则一定存在未被屏蔽的中断源请求信号
解析
答案:A
A. 仅在用户态(执行用户程序)下,CPU 才能检测和响应中断 ❌ 错误 —— 本题选 A
- 中断可以在用户态和内核态下都被响应。
- 虽然中断通常由用户程序运行时触发(如 I/O 完成),但当 CPU 正在执行操作系统内核代码(内核态)时,仍然可以响应更高优先级的中断(尤其是多重中断系统支持嵌套)。
- 例如:在处理一个低优先级中断时,若发生更高优先级的中断(如定时器中断、硬件故障),且该中断未被屏蔽,CPU 仍可响应,实现中断嵌套。
- 因此,中断响应不限于用户态。
✅ 正确认识:
- 中断响应与当前执行的是用户程序还是操作系统代码无关;
- 只要满足:有未屏蔽中断请求 + 开中断(IF=1)+ 当前指令执行完毕,即可响应。
- 多重中断系统的设计目标之一就是允许在内核态(如中断处理中)响应更高优先级中断;
- 实现方式:在关键现场保护后,重新开中断(IF=1),从而允许嵌套;
- 因此,“仅在用户态响应中断”是单级中断或误解系统的典型错误观点。
B. CPU 只有在检测到中断请求信号后,才会进入中断响应周期 ✅ 正确。
- 中断响应的前提是存在外部中断请求(如 INTR 引脚有效);CPU 在每条指令执行结束后采样中断请求信号;
- 若检测到有效请求(说明其未被屏蔽),则启动中断响应周期(保护断点、关中断、取向量等);
C. 进入中断响应周期时,CPU 一定处于中断允许(开中断)状态 ✅ 正确。
- 可屏蔽中断的响应前提是 中断允许标志 IF = 1;若 IF = 0(关中断),即使有中断请求,CPU 也不会响应;
- 因此,能进入中断响应周期,说明 IF 必须为 1;(注意:此规则不适用于不可屏蔽中断 NMI)
👉 在讨论可屏蔽中断时,C 项成立。(在 408 中,如果题目没有提到不可屏蔽中断,外部中断仅考虑可屏蔽中断,此外,本题讨论多重中断系统,多重中断本身仅针对于可屏蔽中断讨论,至于有些人解释不可屏蔽中断没有中断响应周期这个观点是错误的,对于不可屏蔽中断的误解,可以看一下笔记里不可屏蔽中断专题)
D. 若 CPU 检测到中断请求信号,则一定存在未被屏蔽的中断源请求信号 ✅ 正确。
- 中断控制器(如 8259A)会对多个中断源进行管理;它只在有未被屏蔽的中断请求时,才向 CPU 发出总的中断请求信号(INTR);
- 因此,CPU 检测到 INTR 有效,意味着至少有一个中断源的请求既发生又被允许(未屏蔽)。
👉 正确。
【2024-21】下列关于中断I/O方式的叙述中,错误的是( )。
A. 中断屏蔽字用于确定中断响应的优先级
B. 保存断点和程序状态字在中断响应阶段完成
C. 保存通用寄存器和设置新中断屏蔽字由软件实现
D. 单重中断方式下中断处理时 CPU 处于关中断状态
解析
答案:A
本题综合考查中断系统的响应机制、处理流程、屏蔽字作用及单重中断特性,关键在于区分“中断响应优先级”与“中断处理优先级”,以及中断屏蔽字的实际功能。
A. 中断屏蔽字用于确定中断响应的优先级 ❌ 错误 —— 本题选 A
- 中断响应优先级:由硬件电路(如中断控制器中的优先级编码器)固定决定,表示 CPU 响应多个同时请求时的先后顺序,不可通过软件修改。例如:
的响应顺序由硬件连线或固定优先级逻辑决定。
- 中断屏蔽字(Interrupt Mask):是一个可编程寄存器,用于屏蔽(禁止)某些中断源的请求,从而动态调整中断的处理顺序,即影响的是中断处理优先级。
✅ 正确认识:
- 中断屏蔽字 不能改变响应优先级;
- 但它可以通过屏蔽低优先级中断,实现“高处理优先级中断优先服务”,从而控制实际处理顺序。
👉 因此,A 项将屏蔽字的作用对象误认为是“响应优先级”,是概念性错误。
B. 保存断点和程序状态字在中断响应阶段完成 ✅ 正确。中断响应阶段 是 CPU 硬件自动执行的隐式操作(中断隐指令),包括:关中断(可选);保存断点(PC)与程序状态字(PSW);获取中断向量地址,转入中断服务程序。这些操作由硬件自动完成,无需软件干预。
C. 保存通用寄存器和设置新中断屏蔽字由软件实现 ✅ 正确。
- 中断处理阶段 由中断服务程序(软件) 执行,主要包括:
- 保护现场:将 CPU 中的通用寄存器(如 R0~R7、AX、BX 等)压入堆栈;
- 设置中断屏蔽字:在多重中断系统中,通过写中断控制器寄存器,屏蔽优先级低于当前中断的请求,实现嵌套控制;
- 执行具体 I/O 操作;
- 恢复现场,中断返回。
⚠️ 注意:这些操作均通过机器指令编程实现,属于操作系统内核软件行为。
D. 单重中断方式下中断处理时 CPU 处于关中断状态 ✅ 正确。
- 单重中断(Single Interrupt)系统不允许中断嵌套;
- 一旦响应中断,CPU 会自动或由软件关中断(IF=0),防止其他中断打断当前处理;
- 只有在当前中断服务程序执行完毕、执行中断返回指令(如
IRET)后,才恢复中断允许状态;

📌 典型误区提醒:
❌ 错误观点:“屏蔽字改变响应优先级”
✅ 正确认识:“屏蔽字改变的是能否被响应,而不是响应顺序本身”
例如:即使 响应优先级高于
,若
被屏蔽,则
会被响应 —— 这是处理优先级的体现,而非响应优先级改变。
若CPU在执行中断服务程序的过程中,又出现了新的更高优先级的中断请求,而CPU对新的中断请求不予响应,则这种中断称为单重中断,如下左图所示。若CPU暂停现行的中断服务程序,转去处理新的中断请求,则这种中断称为多重中断,又称中断嵌套,如下右图所示。



CPU要具备多重中断的功能,必须满足下列条件:
①在中断服务程序中提前设置开中断指令。
②优先级别高的中断源有权中断优先级别低的中断源。
中断处理优先级是指多重中断的实际优先级处理次序,可以利用中断屏蔽技术动态调整,从而可以灵活地调整中断服务程序的优先级,使中断处理更加灵活。如果不使用中断屏蔽技术,则处理优先级和响应优先级相同。现代计算机一般使用中断屏蔽技术,每个中断源都有一个屏蔽触发器,1表示屏蔽该中断源的请求,0表示可以正常申请,所有屏蔽触发器组合在一起便构成一个屏蔽字寄存器,屏蔽字寄存器的内容称为屏蔽字。CPU还可以通过在程序中执行相应的I/O指令来修改屏蔽字的内容,从而动态地改变中断处理的先后次序。


屏蔽字设置的规律:
- 一般用‘1’表示屏蔽,’0’表示正常申请。
- 每个中断源对应一个屏蔽字(在处理该中断源的中断服务程序时,屏蔽寄存器中的内容为该中断源对应的屏蔽字)。
- 屏蔽字中‘1’越多,优先级越高。每个屏蔽字中至少有一个’1’(至少要能屏蔽自身的中断)。
1.2.6 两种优先级的比较¶
中断屏蔽:是在中断执行过程中,抢占的优先级,即高优先级中断抢占低优先级中断执行,使得低优先级的中断先入栈挂起。待高优先级中断执行完毕返回后低优先级中断恢复执行。一般动态可变,只需改变中断屏蔽寄存器中的字即可。如果不采⽤屏蔽技术,响应的优先次序就是处理的优先次序
| 中断响应优先级(中断判优) | 中断处理优先级(中断屏蔽) |
|---|---|
| 由中断查询程序或硬件判优电路决定的优先权,它反映的是多个中断同时请求时选择哪个先被响应 | 由各自的中断屏蔽字(中断屏蔽字寄存器的内容)来动态设定的,反映了本中断与其他所有中断之间的处理优先关系。 |
| 响应优先级往往是硬件线路已经设置好,不便于改动 | 在多重中断系统中通常用中断屏蔽字对中断处理优先权进行动态分配 |
| 队列中始终存放的是未被响应的中断,且他们的执行优先级(屏蔽优先级)一定都比正在执行的中断的优先级低(不然就可以抢占了) | 当处理优先级(屏蔽优先级)高的中断都执行完毕时,此时中断返回到最初的状态,然后在队列中取响应优先级最高的中断给予响应执行 |
| 响应优先级只在当前无正在执行的中断,需要从队列中判优选择中断执行的时候使用 | 屏蔽优先级(执行优先级)在任何时刻立马使用,一出现屏蔽优先级高的中断立即给予响应并抢占执行 |
拓展:¶

¶
上图为中断系统的基本结构图,从图中可以看出,
- 来自各个外设的中断请求记录在中断请求寄存器中的对应位,每个中断源有各自对应的中断屏蔽字,在进行相应的中断处理之前它被送到中断屏蔽字寄存器中。
- 在CPU执行程序代码时,每当完成当前指令的执行、取出下一条指令之前,都会通过采样中断请求信号引脚(如IA-32中的
INTR)来自动查看有无中断请求信号。若有,则会发出一个相应的中断回答信号,启动图中的“中断查询”线,在该信号线的作用下,所有未被屏蔽的中断请求信号一起送到一个中断判优电路中,判优电路根据中断响应优先级选择一个优先级最高的中断源,然后用一个编码器对该中断源进行编码,得到对应的中断源设备类型号(即中断源的标识信息,称为中断类型号)。 - CPU取得中断源的标识信息后,经过一系列相应的转换,就可得到对应的
中断服务程序的首地址(中断向量),在下一个指令周期开始,CPU执行相应的中断服务程序。
IA-32系统中,中断系统的功能通过可编程中断控制器(
Programmable Interrupt Controller,PIC)实现。每个能够发出中断请求的外部设备控制器都有一条IRQ线,所有外设的IRQ线连到PIC对应的IRQ引脚:IRQ0、IRQ1、…、IRQi、…。如果某个IRQi引脚信号有效,则PIC的中断请求寄存器中对应的那一位被置1,从而将IRQ请求信号记录在中断请求寄存器中。PIC对所有外设发来的IRQ请求按照优先级进行排队,如果至少有一个IRQ线有请求且未被屏蔽,则PIC向CPU的INTR引脚发中断请求。
下面以输入设备为例,结合上图,说明I/O中断处理的全过程。当CPU通过I/O指令的地址码选中某设备后,则
①由CPU发启动I/O设备命令,将接口中的B置“1”,D置“0”。
②接口启动输入设备开始工作。
③输入设备将数据送入数据缓冲寄存器。(先驱动)
④输入设备向接口发出“设备工作结束”信号,将D置“1”,B置“0”,标志设备准备就绪。
⑤当设备准备就绪(D=1),且本设备未被屏蔽(MASK=0)时,在指令执行阶段的结束时刻,由CPU发出中断查询信号。
⑥设备中断请求触发器INTR被置“1”,标志设备向CPU提出中断请求。与此同时,INTR送至排队器,进行中断判优。
⑦若CPU允许中断(EINT=1),设备又被排队选中,即进入中断响应阶段,由中断响应信号INTA将排队器输出送至编码器形成向量地址。
⑧向量地址送至PC,作为下一条指令的地址。
⑨由于向量地址中存放的是一条无条件转移指令,故这条指令执行结束后,即无条件转至该设备的服务程序入口地址,开始执行中断服务程序,进入中断服务阶段,通过输入指令将数据缓冲寄存器的输入数据送至CPU的通用寄存器,再存人主存相关单元。
⑩中断服务程序的最后一条指令是中断返回指令,当其执行结束时,即中断返回至原程序的断点处。至此,一个完整的程序中断处理过程即告结束。
综上所述,可将一次中断处理过程简单地归纳为中断请求、中断判优、中断响应、中断服务和中断返回5个阶段。
- 利用屏蔽技术改变优先等级的例子:
严格地说,优先级包含响应优先级和处理优先级。响应优先级是指CPU响应各中断源请求的优先次序,这种次序往往是硬件线路已设置好的,不便于改动。处理优先级是指CPU实际对各中断源请求的处理优先次序。如果不采用屏蔽技术,响应的优先次序就是处理的优先次序。采用了屏蔽技术后,可以改变CPU处理各中断源的优先等级,从而改变CPU执行程序的轨迹。例如,A、B、C、D这4个中断源的优先级别按A→B→C→D降序排列,根据这一次序,CPU执行程序的轨迹如下图所示。当4个中断源同时提出请求时,处理次序与响应次序一致。

在不改变CPU响应中断的次序下,通过改变屏蔽字可以改变CPU处理中断的次序。例如,将上述4个中断源的处理次序改为A→D→C→B,则每个中断源所对应的屏蔽字发生了变化,如下表所示。表中原屏蔽字对应A→B→C→D的响应顺序,新屏蔽字对应A→D→C→B的处理顺序。

程序的过程中,若A、B、C、D4个中断源同时提出请求,按照中断级别的高低,CPU首先响应并处理A中断源的请求,由于A的屏蔽字是1111,屏蔽了所有的中断源,\ 故A程序可以全部执行完,然后回到主程序。由于B、C、D的中断请求还未响应,而B的响应优先级高于其他,所以CPU响应B的请求,进人B的中断服务程序。在B的服务程序中,由于设置了新的屏蔽字0100,即A、C、D可打断B,而A程序已执行完,C的响应优先级又高于D,于是CPU响应C,进入C的服务程序。在C的服务程序中,由于设置了新的屏蔽字0110,即A、D可打断C,由于A程序已执行完,于是CPU响应D,执行D的服务程序。在D的服务程序中,屏蔽字变成0111,即只有A可打断D,但A已处理结束,所以D可以一直做完,然后回到C程序。C程序执行完后,回到B程序。B程序做完后,回到主程序。至此,A、B、C、D均处理完毕。\ 采用了屏蔽技术后,在中断服务程序中需设置新的屏蔽字,流程如下右所示。与下面最左边那张图的流程相比,增加了置屏蔽字和恢复屏蔽字两部分内容。而且为了防止在恢复现场过程中又出现新的中断,在恢复现场前又增加了关中断,恢复屏蔽字之后,必须再次开中断。


【2015-24】假定下列指令已装入指令寄存器,则执行时不可能导致CPU从用户态变为内核态(系统态)的是( )。
A. DIV R0, R1 ;(R0) / (R1) → R0
B. INT n ;产生软中断
C. NOT R0 ;寄存器R0的内容取非
D. MOV R0, addr ;把地址addr处的内存数据放入寄存器R0中
解析
答案:C
CPU 的用户态(User Mode) 和 内核态(Kernel Mode) 是两种特权级别:
- 用户态:权限受限,只能执行普通指令,不能直接访问关键系统资源或执行特权指令。
- 内核态:高特权模式,可执行所有指令,访问所有内存区域,用于执行操作系统核心功能。
当发生系统调用、中断、异常等事件时,CPU 会从用户态陷入内核态,由操作系统处理。
A. DIV R0, R1 ;(R0)/(R1) → R0
若 R1 = 0,执行除法时发生“除零异常”,属于内部异常(内中断),CPU 会自动切换到内核态,调用异常处理程序(如操作系统中的除零错误处理)。因此,可能导致态切换。
B. INT n ;产生软中断INT n 是软件中断指令,用于主动触发系统调用或调试等操作。执行该指令会引发中断,CPU 跳转到中断向量表对应的处理程序(如 system call 系统调用服务程序),强制进入内核态。 这是用户程序请求操作系统服务的常见方式,必然导致态切换。
C. NOT R0 ;寄存器 R0 的内容取非
这是纯粹的逻辑运算指令,仅对寄存器内容进行按位取反,属于普通算术逻辑操作,不涉及内存访问、特权操作或异常触发。无论在用户态还是内核态均可安全执行,不会引发任何异常或中断。因此绝对不会导致 CPU 切换到内核态。
D. MOV R0, addr ;从内存地址 addr 读数据到 R0
虽然该指令本身是普通访存指令,但关键在于 addr 的地址空间属性:
- 若 addr 指向用户空间:正常访问,不切换态。
- 若 addr 指向内核空间或非法/受保护区域:触发 “访问违规”异常(如段错误、保护异常),CPU 切换到内核态,由操作系统处理(可能终止进程)。
- 若涉及缺页异常(如页不在内存),也会陷入内核态进行页面调度。
因此,该指令在某些情况下会引发态切换
【举一反三】假定下列指令已装入指令寄存器,则执行时不可能导致 CPU 从用户态切换到内核态的是( )。
A. SYSCALL ;触发系统调用
B. MOV addr, R0 ;将寄存器 R0 的值写入内存地址 addr
C. JMP R1 ;无条件跳转到寄存器 R1 指定的地址
D. INC R2 ;寄存器 R2 的内容加 1
解析
答案:D
A. SYSCALL ;触发系统调用 ❌ 一定会切换。SYSCALL 是用户程序请求操作系统服务的标准方式,执行时会主动陷入内核态,跳转到系统调用处理程序。属于典型的用户态 → 内核态转换。
B. MOV addr, R0 ;将 R0 写入内存 addr ❌ 可能切换。
C. JMP R1 ;跳转到 R1 指定地址 ❌ 可能切换。
跳转本身是普通指令,但若 R1 指向:
- 非法地址(如内核代码段);
- 未映射或不可执行页面;
则会触发页错误或执行保护异常,CPU 陷入内核态处理。因此存在切换可能。
D. INC R2 ;寄存器 R2 的内容加 1 ✅ 不可能切换。
这是纯粹的寄存器级算术操作,不访问内存、不修改控制寄存器、不涉及特权操作,也不会产生溢出异常(一般整数加1不触发异常,除非特别定义)。在用户态下可安全执行,不会引发任何异常或中断。
👉 是唯一绝对不可能导致态切换的指令。
【2011-21】某计算机有五级中断 \(L_4~L_0\),中断屏蔽字为 \(M_4M_3M_2M_1M_0\), \(M_i=1(0≤i≤4)\)表示对 \(L_i\)级中断进行屏蔽。若中断响应优先级从高到低的顺序是 \(L_0→L_1→L_2→L_3→L_4\),且要求中断处理优先级从高到低的顺序是 \(L_4→L_0→L_2→L_1→L_3\),则 \(L_1\)的中断处理程序中设置的中断屏蔽字是( )。
A. 11110
B. 01101
C. 00011
D. 01010
解析
答案:D
本题考查 多级中断系统中的中断屏蔽字设置原则,关键在于理解:
中断屏蔽字的作用是:在当前中断处理过程中,决定哪些中断可以“嵌套”进来(即被响应)。
中断屏蔽字(Interrupt Mask Register)是用于控制和管理中断系统的一个寄存器。它通常是在计算机的控制器或处理器中的一个专门寄存器,用于控制中断信号的屏蔽(禁止)和允许。1表示屏蔽,0表示允许。
中断屏蔽字设置原则:在某一级中断(如 )的处理程序中,其屏蔽字应:
- 屏蔽所有处理优先级 ≤
的中断(即比它低或相等的);
- 允许处理优先级 >
的中断(即比它高的,可嵌套)。
✅ 口诀:屏蔽自己及优先级比自己低的中断。
中断处理优先级顺序从高到低:
所以,对于 的中断处理程序:
- 它可以被处理优先级高于它的中断打断(即:
可以嵌套进入);
- 它要屏蔽处理优先级低于或等于它的中断,即:
和
。
⚠️ 注意: 要屏蔽自己(防止同级中断嵌套),也要屏蔽比它低的
。
所以 的中断屏蔽字
- 中断响应优先级:决定哪个中断先被响应(硬件排队逻辑);
- 中断处理优先级:决定哪个中断更重要,是否允许嵌套;
- 中断屏蔽字:由程序员在中断服务程序中设置,用于实现按处理优先级嵌套。
本题中,虽然 响应最快,但
处理优先级最高,说明系统通过屏蔽字实现了“响应顺序 ≠ 处理优先级”的灵活调度。
【2013-22】下列关于中断I/O方式和DMA方式比较的叙述中,错误的是( )。
A. 中断I/O方式请求的是方式请求的是CPU处理时间,DMA方式请求的是总线使用权
B. 中断响应发生在一条指令执行结束后,DMA响应发生在一个总线事务完成后
C. 中断I/O方式下数据传送通过软件完成,DMA方式下数据传送由硬件完成
D. 中断I/O方式适用于所有外部设备,DMA方式仅适用于快速外部设备
解析
答案:D
A. 中断I/O方式请求的是CPU处理时间,DMA方式请求的是总线使用权 ✅ 正确。
- 中断I/O:外设通过中断请求(IRQ)通知CPU“数据已就绪”,请求CPU投入处理时间,由CPU执行中断服务程序完成数据读写(如从I/O端口取一个字节存入内存)。
- DMA方式:DMA控制器代替CPU接管数据传输,向CPU申请系统总线控制权,在设备与内存之间直接传输数据块,无需CPU参与每字节的传输。
👉 两者请求资源不同:CPU时间 vs. 总线使用权。
B. 中断响应发生在一条指令执行结束后,DMA响应发生在一个总线事务完成后 ✅ 正确。
- 中断响应时机:CPU在每条指令执行完毕后检查中断请求信号(INTR),若IF=1,则响应中断。这是为了保证指令执行的完整性。
- DMA响应时机:DMA控制器请求总线(发HOLD信号),CPU在当前总线事务完成(如一次内存读/写)后,释放总线控制权(发HLDA),DMA控制器接管总线进行数据传输。
👉 两者响应都遵循“不打断当前操作”的原则,但粒度不同:指令级 vs. 总线事务级。
C. 中断I/O方式下数据传送通过软件完成,DMA方式下数据传送由硬件完成✅ 正确。
- 中断I/O:数据传输由CPU执行中断服务程序(软件)逐字节/字完成,例如:
data = inb(PORT); // 读设备
*buf++ = data; // 写内存
每个数据单元都需要CPU参与。
- DMA方式:数据传输由 DMA控制器(硬件) 自动完成,CPU仅在传输开始前设置参数(源地址、目标地址、长度),结束后由DMA发中断通知CPU。
D. 中断I/O方式适用于所有外部设备,DMA方式仅适用于快速外部设备
❌ 错误 —— 本题选 D。
中断I/O方式结构简单、开销小,适用于键盘、鼠标、串口等低速设备,对于高速设备,频繁的中断会导致 CPU 开销增大,因此不适用于高速设备;“DMA方式仅适用于快速外部设备”——这是片面的。 DMA特别适用于高速设备(如硬盘、SSD、网卡、显卡),因为它们需要大量数据的高效传输,使用中断I/O会严重占用CPU。但DMA在技术上也可用于低速设备,只是不划算:DMA建立传输的初始化开销较大,对于少量数据(如一个字符),反而不如中断I/O高效。
【2014-22】若某设备中断请求的响应和处理时间为100ns,每400ns发出一次中断请求,中断响应所允许的最长延迟时间为50ns,则在该设备持续工作过程中,CPU用于该设备的I/O时间占整个CPU时间的百分比至少是( )。\ A. 12.5%\ B. 25%\ C. 37.5%\ D. 50%
解析
答案:B
一句话理解,无论延迟时间是多少,每次中断处理都得在下一次中断请求到来之前完成,即每次中断处理实际占用 CPU 时间固定为 100ns;
本题考查 中断I/O方式下CPU时间开销的计算,关键在于理解:
- 中断的周期性;
- 响应和处理时间是CPU必须投入的时间;
- “允许的最长延迟”是约束条件(迷惑考生的条件),但不增加CPU占用时间。
已知条件:
- 中断周期:每 400ns 发出一次中断请求(即中断间隔为 400ns);
- 每次中断的 响应和处理时间 = 100ns(即CPU需连续占用100ns处理该中断);
- 中断响应允许的最长延迟 = 50ns(即从中断请求到CPU开始响应,最多延迟50ns)。
CPU用于I/O的时间 = 每次中断处理占用时间
- 每次中断,CPU需要花费 100ns 执行中断服务程序(包括保存现场、数据读取、恢复现场等)。
- 这100ns是CPU被该设备独占的时间。
中断周期 = 400ns
- 每隔400ns设备发出一次中断,形成周期性负载。
- 为保证不丢失中断,每次处理必须在下一个中断到来前完成。
最长延迟50ns 是约束条件,不影响总占用时间
- 它表示:中断请求发出后,CPU最晚在50ns内必须开始响应。
- 但一旦开始响应,仍需连续100ns完成处理。
- 因此,中断服务程序必须在
[请求时刻 + 50ns]到[请求时刻 + 150ns]之间执行。 - 只要处理在下一次中断(400ns)前完成即可,本题中 150ns < 400ns,满足要求。
⚠️ 注意:延迟时间是“等待响应”的最大容忍时间,不是额外开销。真正占用CPU的是那100ns的处理时间。
计算CPU时间占比:
在每一个400ns的周期内:CPU用于该设备I/O的时间 = 100ns,总时间 = 400ns
👉 所以,CPU时间占比为:
【2015-21】在采用中断I/O方式控制打印输出的情况下,CPU和打印控制接口中的I/O端口之间交换的信息不可能是( )。\ A. 打印字符\ B. 主存地址\ C. 设备状态\ D. 控制命令
解析
答案:B
中断I/O方式的基本原理:CPU 启动设备后继续执行主程序;当外设(如打印机)准备好接收数据或完成操作时,主动发出中断请求;CPU 响应中断,执行中断服务程序,完成数据传送或状态处理;数据传输以单字/字节为单位,由 CPU 通过 I/O 指令与设备的I/O 端口进行读写。
I/O 接口中常见的三类端口(寄存器):

CPU 通过 IN/OUT 指令与这些端口通信,交换信息。
A. 打印字符 ✅ 可能。 打印字符是要输出的数据,CPU 在中断服务程序中通过 OUT 指令将字符写入打印机的数据端口;属于中断I/O方式下典型的数据传输内容。
B. 主存地址 ❌ 不可能 —— 本题选 B。
- 主存地址是内存中的位置,用于指示数据存放位置;
- 在中断I/O方式中,CPU直接参与数据传输,每次由程序从内存中取出字符,再写入I/O端口;
- 但这个“内存地址”不会通过I/O端口传递给打印机接口;打印机接口不关心数据来自内存何处,只接收CPU送来的数据(来自于通用寄存器);
- 若需批量传输,才可能涉及内存地址(如DMA方式中由CPU设置DMA控制器的源地址);
- 但在纯中断I/O方式中,主存地址不通过I/O端口交换。 因此,主存地址不是CPU与I/O端口之间交换的信息。
C. 设备状态 ✅ 可能。
- CPU 通过读取打印机接口的状态端口,获取设备是否“忙”、“出错”、“就绪”等信息;
- 例如:在中断服务程序中先读状态,判断打印机是否空闲,再发送下一个字符;这是中断控制中必要的反馈机制。
D. 控制命令✅ 可能。
- CPU 向打印机接口的控制端口写入命令,如“启动打印”、“换行”、“复位”等;
- 这些命令通过I/O写指令发送给设备;属于控制信息的正常交互。
【2019-21】某设备以中断方式与 CPU 进行数据交换,CPU 主频为 1 GHz,设备接口中的数据缓冲寄存器为 32 位,设备的数据传输率为 50 KBps。若每次中断开销(包括中断响应和中断处理)为 1000 个时钟周期,则 CPU 用于该设备输入/输出的时间占整个 CPU 时间的百分比最多是( )。\ A. 1.25%\ B. 2.5%\ C. 5%\ D. 12.5%
解析
答案:A
本题考查 中断 I/O 方式下 CPU 时间开销的计算,关键在于:
- 理解每次中断传输的数据量;
- 计算每秒中断次数;
- 根据每次中断的时钟周期开销,求出总占用时间;
- 最后计算占 CPU 总时间的百分比。
已知条件:
- CPU 主频:1 GHz → 时钟周期 =
- 数据缓冲寄存器:32 位 = 4 字节(即每次中断传输 4B 数据)
- 设备传输率:50 KBps = 50 × 1000 B/s = 50,000B/s
- 每次中断开销:1000 个时钟周期
方法二(通过时间计算):
第一步:计算每秒中断次数
每次中断可传输 4B 数据,总需传输 50 KB = 50,000 B:
第二步:计算每次中断的时间开销
- 每次中断消耗 1000 个时钟周期;每个周期为 1 ns;
第三步:计算每秒总中断时间
第四步:计算 CPU 时间占比:
方法二(直接用时钟周期计算):
- 每秒中断次数:12,500 次
- 每次中断开销:1000 周期
- 总开销周期数:
- CPU 每秒总周期数:1 GHz =
cycles
【2022-21】下列关于中断I/O方式的叙述中,不正确的是( )。\ A. 适用于键盘、针式打印机等字符型设备\ B. 外设和主机之间的数据传送通过软件完成\ C. 外设准备数据的时间应小于中断处理时间\ D. 外设为某进程准备数据时 CPU 可运行其他进程
解析
答案:C
A. 正确。键盘、鼠标、串口、针式打印机等属于低速字符设备,数据以单字节或少量字符为单位间歇性产生;中断I/O方式适合这类设备:设备就绪后发中断,CPU 暂停当前任务,执行中断服务程序完成一个字节的读/写;避免了CPU轮询的浪费,提高了效率。
B. 正确。在中断I/O方式中,数据传输由 CPU 执行中断服务程序(软件) 完成;例如:
data = inb(PORT); // 从I/O端口读取一个字节
*buffer++ = data; // 存入内存
每个数据单元的传输都需CPU参与,依赖软件逐字节处理;与DMA方式(硬件直接传输)形成对比。
C. 外设准备数据的时间应小于中断处理时间 ❌ 错误 —— 本题选 C
- 这是严重反逻辑的说法。实际要求是:外设准备数据的时间应大于或等于中断处理时间,否则会导致数据丢失。
为什么?
- 外设数据先存入设备控制器(IO 接口)中的数据寄存器(IO 端口);每存一个字节,就发出一次中断;
- CPU 响应中断后,执行服务程序将数据从IO 端口“取走”;
- 若 外设准备数据的速度 > CPU 处理速度(即准备时间 < 处理时间):
- 新数据到来时,旧数据还未被取走;
- 缓冲区被覆盖 → 数据丢失。
✅ 正确要求:中断处理时间 ≤ 外设数据准备时间,才能保证数据不丢失。
D. 正确。在中断I/O方式中,CPU 不会主动等待设备;当某进程发起I/O请求后,可被阻塞或挂起,CPU 调度其他就绪进程运行;当设备准备好数据并发出中断时,CPU 响应中断,完成数据读取;这是操作系统实现并发与多任务调度的基础机制之一,提高了CPU利用率和系统并发性,正确。
【2023-22】下列关于 I/O 控制方式的叙述中,错误的是( )。\ A. 查询方式下,通过 CPU 执行查询程序进行 I/O 操作\ B. 中断方式下,通过 CPU 执行中断服务程序进行 I/O 操作\ C. DMA 方式下,通过 CPU 执行 DMA 传送程序进行 I/O 操作\ D. 对于 SSD、网络适配器等高速设备,采用 DMA 方式输入/输出
解析
答案:C
本题考查四种 I/O 控制方式(程序查询、中断、DMA、通道)中 CPU 的参与程度,重点区分 “谁执行数据传送”。
A. 查询方式下,通过 CPU 执行查询程序进行 I/O 操作 ✅ 正确。
- 在程序查询方式中,CPU 主动循环执行查询程序,不断读取设备状态寄存器,判断设备是否“就绪”;
- 一旦就绪,CPU 执行数据读/写操作;整个过程(状态检测 + 数据传送)均由 CPU 通过软件程序完成。
B. 中断方式下,通过 CPU 执行中断服务程序进行 I/O 操作 ✅ 正确。
- 当外设准备好数据后,向 CPU 发出中断请求;CPU 响应中断,暂停当前程序,转去执行 中断服务程序(ISR);ISR 由操作系统编写,负责从设备端口读取或写入数据;数据传送仍由 CPU 执行指令完成,只是触发机制由中断驱动。
C. DMA 方式下,通过 CPU 执行 DMA 传送程序进行 I/O 操作 ❌ 错误 —— 本题选 C
- 这是对 DMA 机制的根本误解。在 DMA(Direct Memory Access)方式中:
- 数据传送阶段:由 DMA 控制器 直接控制总线,实现外设与内存之间的直接数据传输,无需 CPU 参与每字节的传送;
- CPU 仅在两个阶段介入:
- 预处理:CPU 设置 DMA 控制器的参数(源地址、目标地址、传输长度、方向等);
- 后处理:传输完成后,DMA 控制器发中断通知 CPU,CPU 执行中断服务程序进行善后处理。
⚠️ 关键点:
- “DMA 传送程序”不是由 CPU 执行的”;
- 数据传输是 硬件自动完成 的,CPU 不执行“传送程序”。
D. 对于 SSD、网络适配器等高速设备,采用 DMA 方式输入/输出 ✅ 正确。
- SSD、网卡、显卡等设备具有高带宽、大数据量的特点;若使用中断或查询方式,频繁的 CPU 干预会严重占用处理时间;
- DMA 方式 能让这些设备直接与内存交换数据,极大减轻 CPU 负担,提高系统整体效率;是现代计算机中高速设备的标准 I/O 控制方式。
【2024-21】下列关于中断I/O方式的叙述中,错误的是( )。\ A. 中断屏蔽字用于确定中断响应的优先级\ B. 保存断点和程序状态字在中断响应阶段完成\ C. 保存通用寄存器和设置新中断屏蔽字由软件实现\ D. 单重中断方式下中断处理时 CPU 处于关中断状态
解析
答案:A
本题综合考查中断系统的响应机制、处理流程、屏蔽字作用及单重中断特性,关键在于区分“中断响应优先级”与“中断处理优先级”,以及中断屏蔽字的实际功能。
A. 中断屏蔽字用于确定中断响应的优先级 ❌ 错误 —— 本题选 A
- 中断响应优先级:由硬件电路(如中断控制器中的优先级编码器)固定决定,表示 CPU 响应多个同时请求时的先后顺序,不可通过软件修改。例如:
的响应顺序由硬件连线或固定优先级逻辑决定。
- 中断屏蔽字(Interrupt Mask):是一个可编程寄存器,用于屏蔽(禁止)某些中断源的请求,从而动态调整中断的处理顺序,即影响的是中断处理优先级。
✅ 正确认识:
- 中断屏蔽字 不能改变响应优先级;
- 但它可以通过屏蔽低优先级中断,实现“高处理优先级中断优先服务”,从而控制实际处理顺序。
👉 因此,A 项将屏蔽字的作用对象误认为是“响应优先级”,是概念性错误。
B. 保存断点和程序状态字在中断响应阶段完成 ✅ 正确。中断响应阶段 是 CPU 硬件自动执行的隐式操作(中断隐指令),包括:关中断(可选);保存断点(PC)与程序状态字(PSW);获取中断向量地址,转入中断服务程序。这些操作由硬件自动完成,无需软件干预。
C. 保存通用寄存器和设置新中断屏蔽字由软件实现 ✅ 正确。
- 中断处理阶段 由中断服务程序(软件) 执行,主要包括:
- 保护现场:将 CPU 中的通用寄存器(如 R0~R7、AX、BX 等)压入堆栈;
- 设置中断屏蔽字:在多重中断系统中,通过写中断控制器寄存器,屏蔽优先级低于当前中断的请求,实现嵌套控制;
- 执行具体 I/O 操作;
- 恢复现场,中断返回。
⚠️ 注意:这些操作均通过机器指令编程实现,属于操作系统内核软件行为。
D. 单重中断方式下中断处理时 CPU 处于关中断状态 ✅ 正确。
- 单重中断(Single Interrupt)系统不允许中断嵌套;
- 一旦响应中断,CPU 会自动或由软件关中断(IF=0),防止其他中断打断当前处理;
- 只有在当前中断服务程序执行完毕、执行中断返回指令(如
IRET)后,才恢复中断允许状态;

📌 典型误区提醒:
❌ 错误观点:“屏蔽字改变响应优先级”
✅ 正确认识:“屏蔽字改变的是能否被响应,而不是响应顺序本身”
例如:即使 响应优先级高于
,若
被屏蔽,则
会被响应 —— 这是处理优先级的体现,而非响应优先级改变。
【2009-43】某计算机的CPU主频为500MHz,CPI为5(即执行每条指令平均需5个时钟周期)。假定某外设的数据传输率为0.5MB/s,采用中断方式与主机进行数据传送,以32位为传输单位,对应的中断服务程序包含18条指令,中断服务的其他开销相当于2条指令的执行时间。请回答下列问题,要求给出计算过程。
(1) 在中断方式下,CPU用于该外设I/O的时间占整个CPU时间的百分比是多少?
(2) 当该外设的数据传输率达到5MB/s时,改用DMA方式传送数据。假定每次DMA传送块大小为5000B,且DMA预处理和后处理的总开销为500个时钟周期,则CPU用于该外设I/O的时间占整个CPU时间的百分比是多少(假设DMA与CPU之间没有访存冲突)?
【2016-44】(9分)假定CPU主频为50MHz,CPI为4。设备D采用异步串行通信方式向主机传送7位ASCII字符,通信规程中有1位奇校验位和1位停止位,从D接收启动命令到字符送入I/O端口需要0.5ms。请回答下列问题,要求说明理由。
(1) 每传送一个字符,在异步串行通信线上共需传输多少位?在设备D持续工作过程中,每秒钟最多可向I/O端口送入多少个字符?
(2) 设备D采用中断方式进行输入/输出,示意图如下∶

I/O端口每收到一个字符申请一次中断,中断响应需10个时钟周期,中断服务程序共有20条指令,其中第15条指令启动D工作。若CPU需从D读取1000个字符,则完成这一任务所需时间大约是多少个时钟周期?CPU用于完成这一任务的时间大约是多少个时钟周期?在中断响应阶段CPU进行了哪些操作?
【2018-43】(8分)假定计算机的主频为500MHz,CPI为4。现有设备A和B,其数据传输率分别为2MBps和40MBps,对应I/O接口中各有一个32位数据缓冲寄存器。请回答下列问题,要求给出计算过程。
(1) 若设备A采用定时查询I/O方式,每次输入/输出都至少执行10条指令。设备A最多间隔多长时间查询一次才能不丢失数据?CPU用于设备A输入/输出的时间占CPU总时间的百分比至少是多少?
(2) 在中断I/O方式下,若每次中断响应和中断处理的总时钟周期数至少为400,则设备B能否采用中断I/O方式?为什么?
(3) 若设备B采用DMA方式,每次DMA传送的数据块大小1000B,CPU用于DMA预处理和后处理的总时钟周期数为500,则CPU用于设备B输入/输出的时间占CPU总时间的百分比最大是多少?
【2012-24】中断处理和子程序调用都需要压栈以保护现场,中断处理一定会保存而子程序调用不需要保存其内容的是( )。\ A. 程序计数器\ B. 程序状态字寄存器\ C. 通用数据寄存器\ D. 通用地址寄存器
解析
答案:B
共同点:都需要“保护现场”
无论是中断处理还是子程序调用,为保证执行流能正确返回并恢复执行,都需要保存当前执行上下文。两者都必须保存:
- 程序计数器(PC):保存返回地址;
- 部分通用寄存器:如数据寄存器(AX、BX等)、地址寄存器(SI、DI等),防止被调用代码破坏。
👉 这些是两者共有的保存内容。
核心区别:是否涉及处理器状态的切换

⚠️ 关键点:
- 中断可能引起处理器状态变化(如从用户态进入内核态、中断被屏蔽);
- 因此必须保存 程序状态字寄存器(PSW,又称标志寄存器 FLAGS/EFLAGS);
- 而子程序调用通常在同一特权级内进行,不改变系统状态,无需专门保存 PSW。
A. 程序计数器(PC)❌ 不符合题意。两者都必须保存 PC(或称为断点):
B. 程序状态字寄存器(PSW) ✅ 正确。
- 中断处理:通常由中断隐指令自动保存 PSW;中断可能改变运行模式(如关中断)、涉及特权级切换;必须在中断返回时恢复原始状态(通过
IRET指令); - 子程序调用:一般不保存 PSW;因为调用前后处理器状态不变,标志位通常也不需要恢复;除非程序显式修改标志并需恢复,但这不是调用机制的强制要求。
因此 PSW 是中断处理必须保存、而子程序调用通常不需要保存的内容。
C. 通用数据寄存器 ❌ 不符合题意。两者都可能需要保存通用数据寄存器(如 AX、BX);属于“保护现场”的通用做法,由编译器或程序员根据调用约定决定
D. 通用地址寄存器 ❌ 不符合题意。地址寄存器,在中断和子程序中都可能被使用;若中断服务程序或子程序会修改这些寄存器,都需要保存;
📌 核心要点:
- 中断是系统级事件,可能改变 CPU 的运行状态(特权级、中断允许位等),因此必须保存 PSW;
- 子程序调用是程序级控制转移,不改变系统状态,无需强制保存 PSW
【2018-29】当定时器产生时钟中断后,由时钟中断服务程序更新的部分内容是( )。\ Ⅰ. 内核中时钟变量的值\ Ⅱ. 当前进程占用 CPU 的时间\ Ⅲ. 当前进程在时间片内的剩余执行时间
A. 仅Ⅰ、Ⅱ\ B. 仅Ⅱ、Ⅲ\ C. 仅Ⅰ、Ⅲ\ D. Ⅰ、Ⅱ、Ⅲ
解析
答案:D
时钟中断是操作系统实现时间管理、进程调度和系统统计的核心机制。定时器周期性地发出中断信号(如每 1ms 或 10ms 一次),CPU 响应后执行时钟中断服务程序(Clock ISR),该程序运行在内核态,负责多项关键任务。
Ⅰ. 内核中时钟变量的值 ✅ 正确。操作系统依赖一个或多个内核级时钟变量来维护系统时间,如:
jiffies(Linux 中表示自系统启动以来的时钟滴答数);- 系统 uptime(运行时间);
- 高精度时间戳(如
ktime_t)。
- 每次时钟中断发生时,时钟 ISR 会将这些变量加 1 或累加一个时间增量(如 1ms)。
- 这是实现时间驱动功能(如 sleep、timeout、定时任务)的基础。
👉 必须更新,正确。
Ⅱ. 当前进程占用 CPU 的时间 ✅ 正确。
- 为实现进程调度、资源统计和公平性控制,操作系统需要记录每个进程已使用的 CPU 时间;
- 时钟中断是唯一可靠的时间基准,因此:在每次时钟中断时,操作系统判定当前正在运行的进程;并将其 CPU 使用时间累加一个时间片单位(如 1ms);
- 该信息用于:调度器决策(如优先级调整);用户查看进程资源消耗(
ps,top命令);
Ⅲ. 当前进程在时间片内的剩余执行时间 ✅ 正确。
- 在采用时间片轮转(Round-Robin)调度算法的操作系统中,每个就绪进程被分配一个固定的时间片(如 10ms);
- 时钟中断服务程序会:每次中断到来时,将当前进程的剩余时间片减 1 个单位;若减至 0,说明时间片用完,触发重新调度(设置调度标志,如
need_resched);这是实现抢占式调度的关键机制。
⚠️ 注意:虽然完整的上下文切换通常延迟到中断返回后执行,但“剩余时间更新”和“是否需要调度”的判断是在时钟中断服务程序中完成的。
【2022-31】执行系统调用的过程涉及下列操作,其中由操作系统完成的是( )。\ Ⅰ. 保存断点和程序状态字\ Ⅱ. 保存通用寄存器的内容\ Ⅲ. 执行系统调用服务程序\ Ⅳ. 将 CPU 模式改为内核态
A. 仅Ⅰ、Ⅲ\ B. 仅Ⅱ、Ⅲ\ C. 仅Ⅱ、Ⅳ\ D. 仅Ⅱ、Ⅲ、Ⅳ
解析
答案:B
本题考查 系统调用执行过程中,不同操作的责任归属——哪些由硬件自动完成,哪些由操作系统(软件)实现。
系统调用是用户程序请求操作系统服务的机制,其执行过程涉及 用户态 → 内核态 的切换,以及现场的保存与恢复。
Ⅰ. 保存断点和程序状态字 ❌ 不是操作系统完成 → 错误
- 断点(即程序计数器 PC)和 程序状态字(PSW,如标志寄存器、特权级位)的保存,是由 CPU 硬件在中断响应阶段自动完成 的,这属于 “中断隐指令” 的操作;这些操作无需操作系统干预,由硬件逻辑实现。
Ⅱ. 保存通用寄存器的内容 ✅ 是操作系统完成 → 正确
- 通用寄存器(如 R0~R7、AX、BX、SI、DI 等)保存的是用户程序的中间数据;
- 在进入系统调用服务程序后,为防止被破坏,必须由操作系统编写的服务程序显式保存(通常通过压栈实现);
- 这是“保护现场”的一部分,由 中断服务程序或系统调用入口代码(操作系统内核代码) 完成;属于操作系统内核的软件行为。
Ⅲ. 执行系统调用服务程序 ✅ 是操作系统完成 → 正确
- 系统调用服务程序是操作系统内核中的一段代码,用于实现具体功能(如
read、write、fork); - 根据系统调用号(如
eax中的编号),跳转到对应的处理函数;整个服务程序由操作系统设计、实现和维护。
Ⅳ. 将 CPU 模式改为内核态 ❌ 不是操作系统完成 → 错误
- CPU 模式切换(从用户态到内核态)是 硬件自动完成 的;当执行
int 0x80或syscall指令时,CPU 根据中断向量表跳转,并自动切换特权级;同时,硬件会切换栈指针到内核栈; - 操作系统不直接控制这一切换过程,而是依赖硬件机制。
📌 核心要点:
- 系统调用 = 用户发起 + 硬件切换 + 操作系统服务;
- 操作系统不控制底层硬件切换机制,但负责后续的现场保护和服务执行。
【2024-23】下面关于中断、异常和系统调用的叙述中,错误的是( )。\ A. 中断或异常发生时,CPU 处于内核态\ B. 每个系统调用都有对应的内核服务例程\ C. 中断处理程序开始执行时,CPU 处于内核态\ D. 系统添加新类型设备时,需注册相应的中断服务例程
解析
答案:A
本题综合考查中断、异常与系统调用的执行机制,重点在于理解 CPU 状态切换的时机 以及操作系统对各类事件的响应方式。
A. 中断或异常发生时,CPU 处于内核态 ❌ 错误 —— 本题选 A
- 关键误解:混淆了“发生时”与“处理时”的状态。
- 实际过程如下:
- 中断或异常发生时,CPU 正在执行用户程序,处于用户态;
- 作为响应,CPU 自动切换到内核态;
- 然后才开始执行中断/异常处理程序。
👉 A 项说“发生时 CPU 处于内核态”,时间点错误,是本题唯一错误叙述。
B. 每个系统调用都有对应的内核服务例程 ✅ 正确。
- 系统调用是用户程序请求操作系统服务的接口;
- 每个系统调用号(如
sys_read=0,sys_write=1)对应一个内核中的服务函数;例如:sys_read()、sys_fork()等; - 该例程运行在内核态,执行特权操作(如访问硬件、修改进程表);
C. 中断处理程序开始执行时,CPU 处于内核态 ✅ 正确。
- 在进入中断处理程序之前,CPU 已完成以下操作:保存断点(PC)和程序状态字(PSW);切换到内核栈;提升特权级至内核态;
- 因此,当中断处理程序第一条指令开始执行时,CPU 已处于内核态;否则无法访问内核数据结构或执行特权指令。
D. 系统添加新类型设备时,需注册相应的中断服务例程 ✅ 正确。
- 大多数外设(如网卡、磁盘、键盘)通过中断机制通知 CPU 事件发生(如数据就绪、传输完成);
- 设备驱动程序在加载时,必须向操作系统注册其中断服务程序(ISR);
- 操作系统将该 ISR 与特定中断号(IRQ)绑定,当中断到来时跳转执行;这是设备驱动开发的标准流程。
【2010-32】本地用户通过键盘登录系统时,首先获得键盘输入信息的程序是( )。\ A. 命令解释程序\ B. 中断处理程序\ C. 系统调用服务程序\ D. 用户登录程序
解析
答案:B
本题考查 I/O中断机制中事件处理的初始入口,关键在于理解:谁是第一个响应硬件输入的软件实体。当用户通过键盘输入信息时,整个数据流的起点是硬件中断机制。我们需要按执行顺序梳理流程:
🔍 键盘输入事件的处理流程:
- 用户按下键盘按键→ 键盘硬件检测到键码。
- 键盘控制器发送中断请求(IRQ)→ 通过中断控制器向CPU发出中断信号。
- CPU响应中断,切换到内核态,调用中断处理程序 ✅ 这是第一个获得输入信息的程序 —— 中断处理程序
- 它从键盘控制器的I/O端口读取原始键码;将其转换为扫描码或ASCII码;
- 存入输入缓冲区或内核输入队列;可能唤醒等待输入的进程(如登录程序)。
- 后续处理(非“首先”):
- 用户登录程序(D)从输入缓冲区读取数据;
- 命令解释程序(A)在登录后解析命令;
- 系统调用服务程序(C)用于实现
read()等功能,但不是第一个接触硬件输入的程序。
【2017-32】系统将数据从磁盘读到内存的过程包括以下操作:\ ① DMA控制器发出中断请求\ ② 初始化DMA控制器并启动磁盘\ ③ 从磁盘传输一块数据到内存缓冲区\ ④ 执行“DMA结束”中断服务程序
正确的执行顺序是( )。 A. ③→①→②→④ B. ②→③→①→④ C. ②→①→③→④ D. ①→②→④→③
解析
答案:B
本题考查 DMA(直接存储器存取)方式下磁盘读操作的完整流程,重点在于理解 CPU、DMA控制器、磁盘设备和中断机制 之间的协同顺序。
DMA 的核心目标是:在不依赖 CPU 的情况下,将数据从外设(如磁盘)直接传输到内存,仅在开始和结束时需要 CPU 干预。
② 初始化DMA控制器并启动磁盘 ✅ 第一步
- CPU(通过设备驱动程序)设置 DMA 控制器的参数:
- 内存目标地址(缓冲区起始地址)
- 传输数据长度(字节数)
- 传输方向(读磁盘 → 内存)
- 然后向磁盘控制器发送“读命令”,启动磁盘读操作;
- 此时,CPU 可继续执行其他任务,不参与后续数据传输。
③ 从磁盘传输一块数据到内存缓冲区 ✅ 第二步
- 磁盘完成数据读取后,DMA 控制器接管系统总线;
- 在 DMA 控制器控制下,数据从磁盘的数据寄存器直接传输到内存缓冲区;
- 整个过程 无需 CPU 参与,由硬件自动完成。
⚠️ 注意:这一步发生在中断请求之前。
① DMA控制器发出中断请求 ✅ 第三步
- 当整块数据传输完成后,DMA 控制器向 CPU 发出中断请求(IRQ);
- 通知操作系统:“数据已就绪,可以进行后续处理”;
- 这是 CPU 再次介入的触发点。
④ 执行“DMA结束”中断服务程序 ✅ 第四步
- CPU 响应中断,执行 中断服务程序(ISR);
- 该程序通常由设备驱动实现,功能包括:
- 清除中断状态;
- 通知等待该 I/O 的进程(如唤醒阻塞的进程);
- 更新 I/O 状态表;
- 启动下一次传输(如有);
- 此后,进程可从内存缓冲区读取数据。
所以正确顺序:② → ③ → ① → ④
即:初始化并启动 → 数据传输 → 发中断请求 → 执行中断服务程序
【2024-31】键盘中断服务例程执行结束时,所输入的数据存放位置是( )。\ A. 用户缓冲区\ B. CPU 中的通用寄存器\ C. 内核缓冲区\ D. 键盘控制器的数据寄存器
答案:C
解析
本题考查 键盘中断处理过程中数据的流向,关键在于理解:中断服务例程执行结束时,数据的最终暂存位置,而非中间或初始位置。
🔍 键盘输入的完整数据流:
- 用户按键 →
- 键盘硬件 将键码发送至 键盘控制器的数据寄存器(D)→
- 控制器触发 中断请求(IRQ) →
- CPU 响应中断,执行 键盘中断服务例程(ISR) →
- ISR 从数据寄存器读取键码 →
- 将数据存入内核缓冲区(如输入缓冲区、tty缓冲区)→
- 中断服务例程执行结束 →
- 后续由用户程序通过系统调用(如
read())从内核缓冲区读取数据,复制到用户缓冲区(A)。
A. 用户缓冲区 ❌ 错误。
- 用户缓冲区是应用程序在用户空间分配的内存区域;
- 在中断服务例程执行期间,无法直接访问用户空间(因为此时在另一个进程的地址空间,这里说的用户缓冲区是在等待键盘输入的进程的用户空间,不是当前进程的用户空间);
- 数据必须先暂存于内核空间,后续通过系统调用由操作系统主动复制到用户缓冲区;
- 因此,在 ISR 结束时,数据尚未到达用户缓冲区。
B. CPU 中的通用寄存器 ❌ 错误。
- 通用寄存器(如 EAX、R0 等)在 ISR 执行过程中可能临时存放数据(如从端口读取的键码);
- 但寄存器是临时存储单元,不能长期保存多字符输入;
- 数据会很快被写入内存缓冲区,寄存器可能被后续指令覆盖;因此,不是最终存放位置。
C. 内核缓冲区 ✅ 正确。
- 内核缓冲区是操作系统在内核空间维护的输入队列(如
input_buffer、line_buffer); - 键盘中断服务例程的核心任务之一就是:从键盘控制器读取数据;将键码存入内核输入缓冲区;
- 这样做是为了:
- 支持多个进程共享输入;
- 确保数据在进程读取前不丢失;
- 当 ISR 执行结束时,数据已安全存入内核缓冲区。这是中断服务例程执行结束时的正确存放位置。
D. 键盘控制器的数据寄存器 ❌ 错误。
- 数据寄存器是数据的初始来源;一旦 ISR 从中读取数据,该寄存器内容通常被清空或覆盖;
- 若不及时读取,新按键可能导致数据丢失(寄存器通常只存一个字节);
- 因此,在 ISR 结束时,原始数据已从寄存器移出,不再存放于此。
【2011-26】用户程序发出磁盘I/O请求后,系统的正确处理流程是( )。\ A. 用户程序 → 系统调用处理程序 → 中断处理程序 → 设备驱动程序\ B. 用户程序 → 系统调用处理程序 → 设备驱动程序 → 中断处理程序\ C. 用户程序 → 设备驱动程序 → 系统调用处理程序 → 中断处理程序\ D. 用户程序 → 设备驱动程序 → 中断处理程序 → 系统调用处理程序
解析
答案:B

本题考查 磁盘 I/O 请求在操作系统中的完整处理流程,重点在于理解 用户态与内核态之间的控制转移顺序,以及 系统调用、设备驱动、中断处理 三者的协作关系。
🔍 磁盘 I/O 的典型处理流程(以读操作为例):
1. 用户程序
- 用户程序调用如
read()系统调用函数,请求从文件读取数据; - 该调用触发一条陷入指令(如
int 0x80或syscall),从用户态切换到内核态。
2. 系统调用处理程序
- CPU 跳转到系统调用入口,操作系统识别为 I/O 请求;
- 系统调用处理程序进行参数检查、合法性验证,并确定目标设备;
- 随后调用 设备驱动程序 的接口函数,启动 I/O 操作。
3. 设备驱动程序(Device Driver)
- 设备驱动程序是操作系统中专门管理磁盘的模块;
- 它负责:
- 设置磁盘控制器寄存器(如扇区号、读写命令);
- 初始化 DMA 控制器(若使用 DMA);
- 向磁盘控制器发送“启动读操作”命令;
- 此时,CPU 不再等待,可调度其他进程运行。
4. 硬件执行与中断发生
- 磁盘控制器执行读操作,通过 DMA 将数据从磁盘读入内存;
- 操作完成后,磁盘控制器向 CPU 发出 中断请求(IRQ)。
5. 中断处理程序:CPU 响应中断,执行 磁盘中断服务程序(属于设备驱动的一部分);
- 读取中断状态,确认操作完成;
- 检查是否有错误;
- 唤醒等待该 I/O 完成的进程;
- 设置 I/O 完成标志;
- 最终返回,操作系统将控制权交还给原进程,
read()调用返回。
因此正确顺序:
用户程序 → 系统调用处理程序 → 设备驱动程序 → 中断处理程序
即:B 选项
【2013-25】用户程序发出磁盘 I/O 请求后,系统的处理流程是:用户程序 → 系统调用处理程序 → 设备驱动程序 → 中断处理程序。其中,计算数据所在磁盘的柱面号、磁头号、扇区号的程序是( )。\ A. 用户程序\ B. 系统调用处理程序\ C. 设备驱动程序\ D. 中断处理程序
解析
答案:C
本题考查 磁盘 I/O 过程中逻辑地址到物理地址的转换职责归属,核心在于理解:
谁掌握磁盘的物理结构信息,并负责将文件系统的逻辑块地址转换为具体的物理位置(CHS:柱面、磁头、扇区)?
1. 用户程序(A)❌ 不可能。
- 运行在用户态,权限受限;只知道“我要读取文件的第 N 个字节”,不了解磁盘物理结构;
- 所有 I/O 请求必须通过系统调用进入内核;
2. 系统调用处理程序(B)❌ 不负责。
- 接收
read()、write()等系统调用; - 负责将文件偏移转换为逻辑块号(Logical Block Number, LBN);
- 验证参数合法性,查找对应设备;
- 但不涉及磁盘物理参数(如每柱面多少扇区);
- 完成后将请求传递给设备驱动程序;
- ❌ 不执行 CHS 地址转换。
3. 设备驱动程序(C) ✅ 正确
- 是操作系统中直接管理硬件的模块,运行在内核态;
- 掌握磁盘的物理参数:柱面数(Cylinders)、磁头数(Heads)、每磁道扇区数(Sectors per Track)
- 接收到逻辑块号后,执行 逻辑块 → CHS 转换,例如:
(其中 SPT = 扇区/磁道,HPC = 磁头/柱面)
- 将计算出的柱面、磁头、扇区写入磁盘控制器的寄存器;
- 发送“读/写”命令,启动 I/O 操作。
👉 这是唯一具备完整物理信息并执行寻址计算的模块。
4. 中断处理程序(D) ❌ 不参与。
- 在磁盘 I/O 操作完成后才被触发;此时数据已传输完毕,CHS 地址早已使用过;
- 中断处理程序的作用是:
- 读取状态寄存器,确认操作成功;
- 唤醒等待 I/O 完成的进程;
- 清除中断标志;
📌 类比记忆:
就像快递系统:
- 用户下单(用户程序)
- 客服接收订单(系统调用)
- 配送中心查地图规划路线(设备驱动 → CHS 转换)
- 快递员送达后发短信通知(中断处理)
只有配送中心知道“怎么走”——对应设备驱动负责寻址。本题选 C。
【2022-32】下列关于驱动程序的叙述中,不正确的是( )。\ A. 驱动程序与 I/O 控制方式无关\ B. 初始化设备是由驱动程序控制完成的\ C. 进程在执行驱动程序时可能进入阻塞态\ D. 读/写设备的操作是由驱动程序控制完成的
解析
答案:A
A. 驱动程序与 I/O 控制方式无关 ❌ 错误 —— 本题选 A
- I/O 控制方式 包括:
- 程序查询(Polling)
- 中断驱动(Interrupt-driven)
- DMA(Direct Memory Access)
- 通道控制(Channel)
- 驱动程序必须根据设备所采用的 I/O 控制方式 来设计其数据传输逻辑:
- 若设备使用 中断方式,驱动需注册中断服务程序(ISR);
- 若使用 DMA,驱动需配置 DMA 控制器的源/目标地址、传输长度;
- 若为 内存映射 I/O,驱动通过内存访问指令读写设备寄存器;
- 若为 端口映射 I/O,则使用
in/out指令进行端口操作;
- 因此,驱动程序的设计高度依赖于具体的 I/O 控制方式。
核心要点:
- 驱动程序不是通用模块,而是针对特定设备和 I/O 方式的定制化代码;
- 它必须知道设备如何通信(是轮询?中断?DMA?),才能正确实现数据传输;
- 驱动程序是 I/O 控制方式的具体实现者,二者密切相关,“与 I/O 控制方式无关”是严重误解。
B. 初始化设备是由驱动程序控制完成的 ✅ 正确。
- 当系统启动或设备加载时,驱动程序负责:
- 探测设备是否存在;
- 分配和映射 I/O 端口或内存;
- 设置设备寄存器(如工作模式、波特率、DMA 使能等);
- 启动设备并进入就绪状态;
- 这些都属于设备初始化的核心任务。
C. 进程在执行驱动程序时可能进入阻塞态 ✅ 正确。
- 驱动程序运行在内核态,但由用户进程触发(如调用
read()); - 在执行过程中,若设备尚未就绪(如磁盘未完成读取、缓冲区为空),驱动程序可调用:
wait_event()、sleep_on()等机制,使当前进程阻塞;- 直到设备产生中断、数据就绪后,由中断服务程序唤醒该进程;
D. 读/写设备的操作是由驱动程序控制完成的 ✅ 正确。
- 用户程序通过
read()、write()系统调用请求 I/O; - 系统调用处理程序将请求转发给对应设备的驱动程序;
- 驱动程序负责:
- 将逻辑请求转化为硬件操作;
- 向设备寄存器写入命令;
- 启动数据传输;
- 管理数据缓冲区;
- 所有对设备的直接控制均由驱动完成。
【2023-46】(8分)\ 进程P通过执行系统调用从键盘接收一个字符的输入。已知此过程中与进程P相关的操作包括:\ ① 将进程P插入就绪队列\ ② 将进程P插入阻塞队列\ ③ 将字符从键盘控制器读入系统缓冲区\ ④ 启动键盘中断处理程序\ ⑤ 进程P从系统调用返回\ ⑥ 用户在键盘上输入字符
请回答下列问题。
(1) 按照正确的操作顺序,操作①的前一个和后一个操作分别是上述操作中的哪一个?操作⑥的后一个操作是哪一个?
答案
✅ 正确操作顺序:② → ⑥ → ④ → ③ → ① → ⑤
详细流程说明:
- ② 将进程P插入阻塞队列:
- 进程P执行
read()等系统调用等待键盘输入,但输入尚未到达; - 操作系统将其状态设为“阻塞”,并插入阻塞队列(或等待队列);
- CPU 调度其他进程运行。
- ⑥ 用户在键盘上输入字符:
- 用户按下按键,键盘硬件产生键码。
- ④ 启动键盘中断处理程序:
- 键盘控制器向CPU发出中断请求;
- CPU响应中断,切换到内核态,启动键盘中断处理程序。
- ③ 将字符从键盘控制器读入系统缓冲区:
- 中断处理程序从I/O端口读取键码;
- 存入内核缓冲区;
- 属于键盘驱动程序的职责。
- ① 将进程P插入就绪队列:
- 中断处理程序发现有进程(P)正在等待输入;
- 将其从阻塞队列移出,插入就绪队列;
- 表示进程P已具备继续执行的条件。
- ⑤ 进程P从系统调用返回:
- 当进程P被调度执行时,从系统调用的阻塞点恢复;
- 返回用户态,继续执行后续指令(如
printf输出读到的字符)。
答案:
- 操作①的前一个操作是:③
- 操作①的后一个操作是:⑤
- 操作⑥的后一个操作是:④
(2) 在上述哪个操作之后CPU一定从进程P切换到其他进程?在上述哪个操作之后CPU调度程序才能选择进程P执行?
第一问:CPU一定从进程P切换到其他进程的操作
答案
✅ ② 将进程P插入阻塞队列
- 当进程P因等待I/O而被阻塞时,其状态变为“阻塞”,不再参与调度;
- 调度器必须选择另一个就绪进程运行;
- 因此,在②之后,CPU一定会发生进程切换。
第二问:CPU调度程序才能选择进程P执行的操作
✅ ① 将进程P插入就绪队列
- 只有进入就绪队列的进程才能被调度器选中;
- 在①之前,P处于阻塞状态,不可调度;
- 在①之后,P成为就绪态,可被调度执行。
(3) 完成上述哪个操作的代码属于键盘驱动程序?
答案
✅ ③ 将字符从键盘控制器读入系统缓冲区
- 该操作由键盘中断服务程序完成;而中断服务程序是键盘驱动程序的一部分;
- 驱动程序负责:
- 读取硬件寄存器;
- 解码键码;
- 存入内核输入缓冲区;
- 因此,③是驱动程序的核心功能。
✅ 扩展说明:驱动程序还包括初始化、中断注册、错误处理等,但③是其在I/O过程中最关键的硬件交互操作。
(4) 键盘中断处理程序执行时,进程P处于什么状态?CPU处于内核态还是用户态?
答案
第一问:进程P的状态✅ 阻塞态(或等待态)
- 在键盘中断发生前,进程P已因等待输入被主动阻塞;
- 它当前不在运行,也不在就绪队列中;
- 正在等待“输入完成”这一事件;
- 因此,当中断处理程序执行时,进程P仍处于阻塞状态。
⚠️ 注意:中断处理程序执行本身不会立即唤醒P,但会在处理完后调用 wake_up() 等机制唤醒。
第二问:CPU的状态✅ 内核态
- 中断发生后,CPU自动切换到内核态;中断处理程序运行在内核空间;可访问内核数据结构、设备寄存器等特权资源;
- 因此,CPU处于内核态。
总结图示(流程时间线):





