异常和中断(1)

异常与中断

【考频统计】:

年份考点分值
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分

【名词解释】

  1. 向量中断 : 是指一种识别中断源的技术或方式。识别中断源的目的就是要找到中断源对应的中断服务程序的入口地址,即获得向量地址。采用向量中断进行中断源识别的做法是,采用某种硬件排队线路(如菊花链、并行判优等),对所有未被屏蔽的中断请求进行排队,选出优先级最高的中断源,然后对其编码,得到该中断源的编号(有些书中称其为向量地址),通过总线将其取到CPU中,转换成向量地址,从而取出中断服务程序入口地址或跳转到中断服务程序。还有一种中断源识别方式是用程序(称为中断查询程序)进行识别的软件方法。

  2. 中断向量(interrupt vector):每个中断源都有对应的处理程序,这个处理程序被称为中断服务程序,其入口地址称为中断向量。

  3. 中断向量表(interrupt vector table: 所有中断(包括异常)的中断服务程序入口地址构成一个表,该表被称为中断向量表;也有的机器把中断服务程序入口的跳转指令构成一张表,该表被称为中断向量跳转表。

  4. **向量地址(vector address)**向量地址是指中断向量表或中断向量跳转表中每个表项所在的内存地址。

  5. 中断类型号(interrupt number: 中断类型号是指中断向量表或中断向量跳转表中每个表项所在的表项索引值

  6. 中断服务程序(interrupt service routine): 中断服务程序是指操作系统内核中专门用于针对具体的外部中断进行处理的程序,也称为中断处理程序。当发现中断时,CPU就会把当前正在执行的用户进程停下来,调出操作系统内核中的专门处理相应中断类型的程序来执行,这个程序就是中断服务程序。

  7. 中断屏蔽字寄存器(interrupt maskword register): 指中断控制器中专门用来存放每个中断源对应的中断屏蔽字的寄存器。

  8. 中断请求寄存器(interrupt request register) : 指中断控制器中专门用来存放每个设备对应的中断请求信号的寄存器。

  9. 中断响应优先级(interrupt response priority): 指当多个中断请求发生时,优先响应哪个中断请求。它是由中断控制器中的硬件排队线路或中断查询程序的查询顺序决定的,不可动态改变。

  10. 中断处理优先级(interrupt process priority): 反映的是正在处理的中断是否比新发生的中断的处理优先级低(即屏蔽位为“0”,对新中断开放),如果是,就中止正在处理的中断,转到新中断服务程序去执行,处理完后回到原来被中止的中断服务程序继续执行。中断处理优先级可以由中断屏蔽字来动态改变

  11. 多重中断(multiple interrupt): 在中断处理(即执行中断服务程序)过程中,如果又有新的处理优先级更高的中断请求发生,那么CPU应立即中止正在执行的中断服务程序,转去处理新的中断,这种情况被称为多重中断或中断嵌套。

  12. 异常和中断请求的检测、异常和中断的响应都是由硬件完成

  13. 时钟中断

    时钟中断是系统时钟产生的中断,更新系统时间、时间片下的进程调度、延时操作等与时间相关的操作均依赖时钟中断来实现。

    【例题】:下面关于时钟中断的说法,正确的说法个数是()
    ①时钟中断的产生频率由硬件决定
    ②时钟中断属于程序性中断
    ③时钟中断时间间隔是计算机中的基本计时单位 ④时钟中断的处理可能引发进程调度

    A.1个 B.2个 C.3个 D.4个

    本题需要区分CPU时钟和系统时钟,前者与时钟周期相关,是计算机的固有硬件属性,后者用来负责时钟中断,可以由操作系统来进行设定和初始化。时钟中断由系统时钟发出,属于外中断,②错误;系统时钟可以由操作系统来进行设定和初始化,因此①错误;计算机中的基本计时单位是由CPU时钟决定的时钟周期,因此③错误;发生时钟中断时,操作系统会检查当前进程的时间片,若时间片用完则触发进程调度,因此④正确。答案选A。

  14. 硬中断与软中断

    ​ 硬中断不等价于硬件中断,软中断也不等价于软件中断。硬中断指的是中断响应过程由硬件实现的中断,408范围内题目不做特殊说明都是硬中断。软中断是纯粹由软件实现的一种类似中断的机制,实际上它就是模仿硬件,在内存中有一个地方存储着软中断的标志位,然后由内核的一个线程不断轮询这些标志位,如果有哪个标志位有效,则再去另一个地方寻找这个软中断对应的中断处理程序。

    软中断指令INTn被设定为一种陷阱异常,例如,Linux通过int$0x80指令将128号设定为系统调用,而Windows通过in s0x2e
    令将46号设定为系统调用。

  15. 可编程中断控制器(Programmable Interrupt Controller,PIC)

    image-20230714100434368

    可编程的中断控制器即可编程的中断控制接口。中断控制器的基本功能包括以下几个方面:

    • ①及时记录各种中断请求信号,通常用一个中断请求寄存器来保存;
    • 自动响应中断请求,CPU在每条指令执行完后,会自动检测中断请求引脚,发现有中断请求后会自动响应中断;
    • ③在同时有多个中断请求时,能自动选择响应优先级最高的中断请求
    • ④通过中断屏蔽实现多重中断的嵌套执行,中断屏蔽功能通常用一个中断屏蔽字寄存器来实现。
  16. 异常和中断事件形成的异常控制流与进程上下文切换引起的异常控制流有何不同?

    答:在一个进程正常运行过程中,可能会出现一些特殊事件,这些事件的发生将导致当前进程无法继续执行下去。这些特殊事件统称为异常(exception)或中断(interrupt)。发生异常或中断时,CPU必须转到具体的处理特殊事件的异常处理程序或中断服务程序去执行,因而正在执行的进程的逻辑控制流被打断,从而引起一个异常控制流。不过,这种异常控制流与上下文切换引起的异常控制流有一个明显的不同:进程上下文切换后,CPU执行的是另一个用户进程;而对于中断或异常引起的异常控制流,其调出的异常处理程序或中断服务程序并不是一个进程,而是一个“内核控制路径”,异常处理程序或中断服务程序是代表异常或中断发生时正在运行的当前进程在内核态执行的一个独立指令序列。它作为一个内核控制路径,比进程更“轻”,其上下文信息比一个进程的上下文信息少得多。

  17. 中断方式下,外设任何时候都可以申请中断并马上得到响应吗?

    答:不是。中断方式下,外设何时发出中断请求是由外设接口中的中断逻辑决定的,不受CPU的限制,但何时响应中断与CPU执行指令过程有关。CPU总是在一条指令执行完、取下条指令之前去查询有无中断请求。如果此时是开中断状态,并有未被屏蔽的中断请求发生,则CPU进入中断响应周期,自动执行一条隐指令,完成关中断、保护断点、取中断向量三个操作。因此,不是任何时候都马上响应中断。中断响应的条件有三个:①CPU处于开中断状态(中断允许触发器EINT置“1”状态);②至少有一个未被屏蔽的中断请求发生;③一条指令执行结束。

  18. 为什么在响应中断的时候保存断点,而在处理中断的时候保存现场?

    答:断点是中断返回到被中断程序继续执行处指令的地址(即响应中断时PC的值),其在中断响应时先被保存到栈中,否则,当取来中断服务程序的首地址送PC后,原来作为断点的PC的值就被破坏了;而现场是被中断的原程序在断点处各个寄存器的值,只要在这些寄存器再被使用前保存到栈中即可。因为在实际处理中断事件过程中可能要用到这些寄存器,所以在实际处理之前的准备阶段来保存现场(寄存器压栈),而在实际处理后的结束阶段再恢复现场(寄存器出栈)。这样就能保证被中断程序的现场不被中断服务程序破坏。

  19. 单重中断和多重中断的区别是什么?

    答:单重中断情况下,在中断处理整个过程中,不允许响应新的中断请求,其做法是在中断响应开始时关中断(使中断允许触发置“0”),而直到中断处理结束后才开中断,然后返回到原断点处继续执行。
    多重中断系统中,如果在进行某个中断请求的处理过程中,又发生了新的中断请求,则可以中止正在进行的中断处理,转到新的中断服务程序执行。因此,在中断处理过程中,应该开中断,允许响应新的中断请求。其做法是在实际处理中断事件前就开中断,而不是像单重中断那样在处理后才开中断。这样保证在实际中断处理过程中可以响应新的中断请求。

  20. IA-32Linux分别代表了硬件和软件(操作系统内核),根据它们各自在整个异常和中断处理过程中所做的具体工作,能否归纳总结出硬件和软件在异常和中断处理过程中分别完成哪些主要工作?

    答:在异常和中断处理过程中,硬件主要包括CPU和I/O模块两方面的工作,I/O模块主要是针对中断处理。
    (1)CPU在执行指令过程中需要对各种异常事件进行检测,例如,是否在取指令时发生了缺页故障(page fault),是否在指令译码时发生了非法操作,是否整除指令的除数为0,是否取数时发生缺页故障,是否执行的是陷阱指令,是否是单步跟踪等。如果发生了以上任何异常事件,则CPU根据检测结果得到异常类型号,然后进入异常响应处理阶段。
    (2)CPU在执行完每条指令、取下条指令之前,要检测中断请求线(包括不可屏蔽中断请求线)是否有效,若发现有中断请求,则通过中断查询线发出中断回答信号,启动中断控制器所有未被屏蔽的中断请求信号根据响应优先级进行排队,中断控制器选择响应优先级最高的中断请求,生成相应的中断类型号,通过数据总线回送给CPU,CPU得到中断类型号后,进入中断响应处理阶段。
    (3)在异常或中断响应处理阶段,CPU要完成从发生异常或中断的进程的执行转到在内核态下异常处理程序和中断服务程序的执行,这个过程通常需要完成三个操作:保存断点和程序状态、关中断、根据异常或中断类型号转到异常处理程序或中断服务程序的第一条指令执行。随后的处理就由软件来完成。
    在异常和中断处理过程中,当CPU完成对异常或中断的响应处理后,就会调出异常处理程序或中断服务程序,因此,软件对异常和中断处理主要是在异常处理程序或中断服务程序中进行的处理。对于不同异常和中断类型,其对应处理程序的功能也完全不同。
    此外,软件(操作系统)还需要对异常处理程序和中断服务程序以及相应的中断向量表或中断描述符表进行初始化工作。

  21. 对于中断和异常的处理,操作系统所做的工作有什么?

    编写中断服务程序
    操作系统程序员所做的核心工作便是为各类中断(异常) 编写中断服务程序, 当中断和异常被触发时, 系统进入内核态并跳转到中断服务程序来执行操作系统程序。

    设置中断向量表
    操作系统被加载到内存后, 最先执行操作系统初始化程序, 在这个过程中一项重要的工作便是设置中断向量表: 由操作系统程序员编写的各类中断服务程序均被加载到了内存中的特定位置, 此时, 需要设置中断向量表, 使各种中断源与其中断服务程序的地址对应起来。

    ​ 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**。

    c0843e9c2165cdde6a195a3279046fbd

    开机后系统首先在实地址模式下工作,需要先准备在实地址模式下的中断向量表和中断服务程序。通常,这个准备工作是由固化在计算机主板上的一块ROM芯片中的BIOS程序来完成的。BIOS程序首先检测显卡、键盘、内存等,并在主存的00000H~003FFH区域建立中断向量表,同时,在中断向量所指的主存区域建立相应的中断服务程序

    ​ BIOS利用INT指令执行特定的中断服务程序可以把操作系统内核程序从磁盘加载到内存中。例如,BIOS可以通过执行指令int0x19来调用中断向量0x19对应的中断服务程序,将启动盘上的0号磁头对应盘面的0磁道1扇区中的引导程序装入内存

    ​ BIOS中包含了各种基本设备的驱动程序,通过执行BIOS程序,这些基本设备驱动程序以中断服务程序的形式被加载到内存中,以提供基本I/O系统调用。一旦进入保护模式,就不再使用BIOS。

  22. IA-32保护模式并不像实地址模式那样将异常处理程序或中断服务程序的入口地址直接填入0000H-003FH存储区,而是借助于中断描述符表来获得异常处理程序或中断服务程序的入口地址。

    906131445244d30608a81030cd10cab1

    ​ 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个异常和中断。每一个表项是一个中断门描述符、陷阱门描述符或任务门描述符,如图所示是中断门描述符格式

    19969cfbb958544090afd3e5bd2c8a6d

    DPL给出访问本段要求的最低特权等级。因此,DPL为0的段只能当CPL为0(内核态)可访问,而对于DPL为3的段,则任何进程都可以访问。在DPL后面的一位都是0、再后面四位用来标识门的类型(TYPE)。若是中断门,则TYPE=1110B;若是陷阱门,则TYPE=1111B;若是任务门,则TYPE=0101B
    ​ 中断门描述符和陷阱门描述符中都会给出一个16位的段选择符和32位的偏移地址。段选择符来指示异常处理程序或中断服务程序所在段的段描述符在GDTLDT中的位置,偏移地址则给出异常处理程序或中断服务程序第一条指令所在的偏移量

    IDTi中的段选择符装入CSIDTi中的偏移地址装入EIP,它们是异常处理程序或中断服务程序第一条指令的逻辑地址。

    ​ Linux内核在启用异常和中断机制之前,需要先设置好每个IDT的表项IDTi0≤i<256),并把 IDT的首地址存入**IDTR寄存器**。这个工作是在系统初始化时完成的。
    ​ 系统初始化时,Linux完成对GDTGDTR、IDTIDTR等的设置,这样,以后一旦发生异常或中断,则CPU可以通过异常和中断响应机制调出异常或中断处理程序执行。

    a7ff9a9a133f4125103a9358837d20b1

1.1 异常与中断的概念与分类

1.1.1 异常与中断的概念

一个进程在正常执行过程中,其逻辑控制流会因为各种特殊事件被打断,例如时间片轮转处理器调度,在每个时间片到时,当前进程的执行被新进程打断。除此之外,打断进程正常执行的特殊事件还有:用户按下Ctrl+C键、当前指令执行时发生了不能使指令继续执行的意外事件、I/O设备完成了系统交给的任务需要系统进一步处理等。这些特殊事件统称为异常(exception)或中断(interrupt)。当发生异常或中断时,正在执行进程的逻辑控制流被打断,CPU转到具体的处理特殊事件的内核程序去执行。不同计算机体系结构和教科书对异常和中断这两个概念规定了不同的内涵。408考试中我们将使用Intel体系结构规定的“中断”和“异常”的概念。

在早期的Intel微处理器中,并不区分异常和中断,两者统称为中断,由CPU内部产生的意外事件称为“内中断”,从CPU外部通过中断请求引脚INTRNMI向CPU发出的中断请求为“外中断”。从80286开始,Intel统一把“内中断”称为异常,而把“外中断”称为中断。

Intel对异常和中断进行了如下描述:处理器提供了异常和中断这两种打断程序正常执行的机制。**中断是一种典型地由I/O设备触发的、与当前正在执行的指令无关的异步事件;而异常是处理器执行一条指令时,由处理器在其内部检测到的、与正在执行的指令相关的同步事件。**有时为了强调异常是CPU内部执行指令时发生,而中断是CPU外部的I/O设备向CPU发出的请求,特称异常为“内部异常”,而称中断为“外部中断”。实际上,异常和中断两者的处理过程基本上是相同的,这也是为什么在有些体系结构或教科书中将两者统称为“中断”或统称为“异常”的原因。异常和中断引起的异常控制流如图所示。

image-20230714094058513image-20230714094549705

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

异常和中断处理的大致过程如下

image-20240114230823775

当CPU在执行当前程序或任务(即用户进程)的第i条指令时检测到一个异常事件,或在执行第i条指令后发现有一个中断请求信号,则CPU会打断当前用户进程,然后转到相应的异常或中断处理程序去执行。若异常或中断处理程序能够解决相应问题,则在异常或中断处理程序的最后,CPU通过执行“异常/中断返回指令”回到被打断的用户进程的第i条指令或第i+1条指令继续执行;若异常或中断处理程序发现是不可恢复的致命错误,则终止用户进程。通常情况下,对于异常和中断事件的具体处理过程全部由操作系统(可能包括驱动程序)软件来完成。
通常,把处理异常事件的程序称为异常处理程序,把处理中断事件的程序称为中断服务程序,合在一起时称其为异常或中断处理程序

中断技术的主要功能:

  • 早期的中断技术是为了处理数据传送;
  • 实现CPU与I/O设备的并行工作
  • 处理硬件故障和软件错误
  • 实现人机交互,用户干预机器需要用到中断系统
  • 实现多道程序、分时操作,多道程序的切换需借助于中断系统。
  • 实时处理需要借助中断系统来实现快速响应。
  • 实现应用程序和操作系统(管态程序)的切换,称为“软中断”。
  • 多处理器系统中各处理器之间的信息交流和任务切换。

1.1.2 异常与中断的分类

1.1.2.1 内部异常的分类

内部异常(exception)是指在CPU内部发生的意外事件或特殊事件。

  1. 发生原因分为以下两类

    • 硬故障中断: 如电源掉电、硬件线路故障等

    • 程序性中断: 执行某条指令时发生的“例外(Exception)" 事件,如溢出、缺页、越界、越权、越级、非法指令、除数为0、堆/栈溢出、访问超时、断点设置、单步、系统调用等

  2. 按发生异常的报告方式和返回方式的不同 (处理方式),内部异常可分为
    • 故障(fault):执行指令引起的异常事件,如溢出、非法指令、缺页、访问越权等。“断点”为发生故障指令的地址
    • 自陷(trap) :预先安排的事件( "埋地雷”),如单步跟踪、断点、系统调用(执行访管指令)等。是一种自愿中断。断点”为自陷指令下条指令地址(注意:当自陷指令是转移指令时,并不能返回到下一条指令执行,而是返回到转移目标指令执行)
    • 终止(abort):硬故障事件,此时机器将“终止”,调出中断服务程序来重启操作系统。断点”是什么?随便!

    【注意】:

    1. 在历年408考题以及袁书习题中,一般默认自陷指令完成后返回到下条指令执行,并不考虑转移指令。
    2. 哪些故障补救后可继续执行,哪些只好终止当前进程?
      缺页、TLB缺失等:补救后可继续,回到发生故障的指令重新执行。上溢出、除数为0、非法指令、内存保护错等: 终止当前进程。

    1.故障

故障也称为失效,是指引起故障的指令在执行过程中,CPU检测到的一类与指令执行相关的意外事件。这种意外事件有些可以恢复,有些则不能恢复。

  • 对于像溢出和非法操作码等这类故障,因为无法通过异常处理程序恢复,所以不能回到被中断的程序继续执行,通常异常处理程序在屏幕上显示一个对话框告知发生了某种故障,然后调用内核中的abort例程,以终止发生故障的当前进程。

    浮点数下溢,直接当作机器0处理,不会引起中断;浮点数上溢,表示超过了浮点数的表示范围,属于内部异常。

  • 对于除数为0的情况,根据是定点除法指令还是浮点除法指令有不同的处理方式

    • 对于浮点数除0,异常处理程序可以选择将指令执行结果用特殊的值(如 ∞ 或 N a N ∞或NaN NaN)表示,然后返回到用户进程继续执行除法指令后面的一条指令;

    • 对于整数除0,则会发生“整除0”故障,通常调用abort例程来终止当前用户进程。

  • 对于页故障,根据内存管理等知识可知,CPU在执行指令过程中需要访问存储器时,首先MMU进行地址转换,因此页故障事件由硬件(MMU)发现。以下几种情况都会发生“页故障”。

    1. 缺页:页表项有效位为0 ← 可通过读磁盘恢复故障
    2. 地址越界:地址大于最大界限 不可恢复, 称为“段故障(segmentation fault) "
    3. 访问越级或越权(保护违例) : 不可恢复, 称为“段故障(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

已知系统采用分页虚拟存储管理方式,页大小为4KB。若在运行P对应的进程时,系统中没有其他进程在运行,则对于上述三条指令的执行,在取指令时是否可能发生页故障?在数据访问时分别会发生什么问题?哪些问题是可恢复的?哪些问题是不可恢复的?

解:对于上述三条指令的执行,访问指令时都不会发生缺页,因为在执行这些指令之前,一定执行过其他位于这些指令前面的指令,它们都位于起始地址为0x08048000(是一个4KB页面的起始位置)的同一个页面,所以,在执行这三条指令之前,它们已经随着前面某条指令一起被装入了内存。因为没有其他进程在系统中运行,所以不会因为执行其他进程而使得调入主存的页面被调出到磁盘。综上所述,执行到这三条指令时,都不会在取指令时发生页故障。

对于第5行对应指令的执行,数据访问时会发生缺页异常,但是是可恢复的故障。因为,对于地址为0x8049028的a[10]的访问,是对所在页面(起始地址为0x08049000,是一个4KB页面的起始位置)的第一次访问,因而对应页面不在主存。当CPU执行到该指令时,检测到缺页异常,即发生了页故障,此时,CPU暂停用户进程P的执行,将控制转移到操作系统内核,调出内核中的“**页故障处理程序”**执行。在页故障处理程序中,检查是否地址越界或访问越权,显然这里没有发生越界和越权情况,故将地址0x8049028所在页面从磁盘调入内存,处理结束后,再回到这条movl指令重新执行,此时,再访问数据就没有问题了。处理过程如图所示。

113B5E86F4316C371899393C6F3EA5C0

对于第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

  1. 自陷

陷阱也称为自陷或陷入,与“故障”等其他异常事件不同,是预先安排的一种“异常”事件,就像预先设定的“陷阱”一样。当执行到陷阱指令(也称为自陷指令)时,CPU就调出特定的程序进行相应的处理,**处理结束后返回到陷阱指令的下一条指令执行。**其处理过程如图7.12所示。

image-20230714094950979

陷阱的重要作用之一是在用户程序和内核之间提供一个像过程一样的接口,这个接口称为系统调用用户程序利用这个接口可以方便地使用操作系统内核提供的一些服务。操作系统给每个服务编一个号,称为系统调用号,每个服务功能通过一个对应的系统调用服务例程提供。

为了使用户程序在需要调用内核服务功能的时候,能够从用户态转到对应的系统调用执行,处理器会提供一个或多个特殊的系统调用指令,如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. 终止

如果在执行指令过程中发生了使机器无法继续执行的硬件故障,如电源掉电、线路故障、控制器出错、存储器校验错等,则程序无法继续执行,只好终止,此时,调出中断服务程序来终止发生问题的进程,甚至要重启系统。这种异常与故障和自陷不同,不是由特定指令产生的,而是随机发生的。

abfb3a2946680d2d54e29bd4931702ab

【注】:故障异常和自陷异常属于程序性异常(软件中断);而终止异常和外中断属于硬件中断


1.1.2.2 外部中断的分类

程序执行过程中,若外设完成任务或发生某些特殊事件(如打印机缺纸、定时采样技术时间到、键盘缓冲满等),会向CPU发中断请求,要求CPU对这些情况进行处理。所以说中断是由外部I/O设备请求处理器进行处理的一种信号,它不是由当前执行的指令引起的。外部I/O设备通过特定的中断请求信号线向CPU提出中断申请。

CPU在执行指令的过程中,每执行完一条指令就查看中断请求引脚,如果中断请求引脚的信号有效,则进入中断响应周期。在中断响应周期中,CPU先将当前PC值(称为断点)和当前的机器状态保存到栈中,并设置成“关中断”状态,然后,从数据总线读取中断类型号根据中断类型号跳转到对应的中断服务程序执行。中断响应过程由硬件完成,而中断服务程序执行具体的中断处理工作,中断处理完成后,再回到被打断程序的“断点”处继续执行。中断的整个处理过程如图7.14所示。
Intel将外部中断分成可屏蔽中断(maskable interrupt,INTR)和不可屏蔽中断(nonmaskable interrupt,NMI)。

0B5F5637E4275F4A2B25B692C7F337E0
  1. 可屏蔽中断

可屏藏中断是指通过可屏蔽中断请求线INTR向CPU进行请求的中断,主要来自I/O设备的中断请求。CPU可以通过在中断控制器中设置相应的屏蔽字来屏蔽它或不屏蔽它,若一个I/O设备的中断请求被屏蔽,则它的中断请求信号将不会被送到CPU。一般外设中断源引起的中断都是可屏蔽中断。

  1. 不可屏蔽中断

不可屏蔽中断通常是非常紧急的硬件故障,通过**专门的不可屏蔽中断请求线NMI**向 CPU发出中断请求。如:电源掉电,时钟中断、硬件线路故障等,这类中断请求信号一旦产生,任何情况下它都不可以被屏蔽,因此一定会被送到CPU,以便让CPU快速处理这类紧急事件。通常,这种情况下,中断服务程序会尽快保存系统重要信息,然后在屏幕上显示相应的消息或直接重启系统。

  • 25
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
旅游社交小程序功能有管理员和用户。管理员有个人中心,用户管理,每日签到管理,景点推荐管理,景点分类管理,防疫查询管理,美食推荐管理,酒店推荐管理,周边推荐管理,分享圈管理,我的收藏管理,系统管理。用户可以在微信小程序上注册登录,进行每日签到,防疫查询,可以在分享圈里面进行分享自己想要分享的内容,查看和收藏景点以及美食的推荐等操作。因而具有一定的实用性。 本站后台采用Java的SSM框架进行后台管理开发,可以在浏览器上登录进行后台数据方面的管理,MySQL作为本地数据库,微信小程序用到了微信开发者工具,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得旅游社交小程序管理工作系统化、规范化。 管理员可以管理用户信息,可以对用户信息添加修改删除。管理员可以对景点推荐信息进行添加修改删除操作。管理员可以对分享圈信息进行添加,修改,删除操作。管理员可以对美食推荐信息进行添加,修改,删除操作。管理员可以对酒店推荐信息进行添加,修改,删除操作。管理员可以对周边推荐信息进行添加,修改,删除操作。 小程序用户是需要注册才可以进行登录的,登录后在首页可以查看相关信息,并且下面导航可以点击到其他功能模块。在小程序里点击我的,会出现关于我的界面,在这里可以修改个人信息,以及可以点击其他功能模块。用户想要把一些信息分享到分享圈的时候,可以点击新增,然后输入自己想要分享的信息就可以进行分享圈的操作。用户可以在景点推荐里面进行收藏和评论等操作。用户可以在美食推荐模块搜索和查看美食推荐的相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值