2.1列举几种中断。列举几种异常。中断和异常有何区别?
几种常见的中断包括:
-
输入/输出(I/O)中断:当计算机需要等待外部设备(如硬盘驱动器、键盘、鼠标)完成它们的任务时,它会发出I/O中断。
-
时钟中断:时钟中断是一个计时器发出的中断,它定期发生,以确保操作系统和其他软件程序能够在一定的时间内运行。
-
硬件故障中断:当计算机检测到硬件故障(如内存错误或CPU过热)时,它会发出硬件故障中断。
几种常见的异常包括:
-
算术异常:当尝试执行除以零或取模操作时,会发生算术异常。
-
内存访问异常:当尝试访问未分配或不存在的内存位置时,会发生内存访问异常。
-
保护异常:当尝试执行不允许的操作(如读取操作系统保护的内存区域)时,会发生保护异常。
中断和异常的区别:
中断和异常都是计算机处理器在执行程序时出现的意外情况,但它们的来源不同。中断是由外部事件(如I/O设备请求)引起的,而异常是由正在执行的程序中的错误或意外情况引起的。此外,中断会暂停正在执行的程序并运行特定的中断处理程序,而异常则可能导致程序崩溃或产生其他错误结果
2.2现代计算机中的处理机为什么设置用户态、核心态这两种不同的状态?有哪些指令必须在核心态下运行?为什么?
现代计算机中设置用户态和核心态这两种不同的状态,是为了保证操作系统和应用程序的安全性和稳定性。用户态和核心态的主要区别在于对系统资源的访问权限。在用户态下,应用程序只能访问自己的地址空间和受限的系统资源,而在核心态下,操作系统可以访问所有的系统资源,包括CPU、内存、IO设备等。在核心态下运行的指令通常被称为特权指令,这些指令具有更高的权限和更大的访问范围,能够执行一些敏感的操作,如修改内存映射表、更改中断向量表、启用或禁用中断等等。这些指令需要在核心态下运行,以防止应用程序意外或恶意地更改系统的关键部分,从而破坏系统的安全和稳定性。
一些必须在核心态下运行的指令包括:
-
修改控制寄存器的指令,如CR0、CR2、CR3等。这些寄存器存储了系统的控制信息,如内存管理、中断处理、异常处理等。
-
启用或禁用中断的指令,如STI(Set Interrupt Flag)和CLI(Clear Interrupt Flag)指令。这些指令用于开启或关闭中断,从而控制系统的响应和处理能力。
-
内存保护相关的指令,如页表的修改和切换指令,如MOV CR3、INVVPID等。这些指令用于管理系统的内存映射表,保护系统的内存不受非法访问和破坏。
-
总之,现代计算机中设置用户态和核心态这两种不同的状态,是为了保证系统的安全和稳定性。必须在核心态下运行的指令具有更高的权限和更大的访问范围,需要被严格控制,以保证系统的正确性和可靠性。
2.3 为什么要把中断分级?如何设定中断的优先级?高级中断是如何打断低级中断处理过程的?
把中断分级是为了在多个中断同时发生时能够有条不紊地进行处理,防止出现混乱和冲突,提高系统的响应能力和可靠性。
中断分级通常分为硬件中断和软件中断两种。硬件中断包括可屏蔽中断(IRQ)和非可屏蔽中断(NMI)两种类型,而软件中断则是通过软件触发的中断,例如系统调用、软件异常等。这些中断按照优先级从高到低排序,高级别的中断可以打断低级别的中断处理过程。
在x86架构中,中断的优先级是通过中断向量号来确定的。中断向量号的范围是0255,其中031是预留给处理器异常和错误的,32255是预留给外部中断和软件中断的。其中,015的中断向量号是保留给处理器异常和错误的,1631的中断向量号是保留给处理器硬件中断的,32255的中断向量号是留给外设和软件使用的。
不同的中断可以通过中断控制器进行管理,例如可编程中断控制器(PIC)和高级可编程中断控制器(APIC)。中断控制器通过中断请求信号(IRQ)将中断传递给处理器,然后根据中断向量号来确定中断的优先级,并根据优先级来决定是否打断正在处理的中断。
当高级中断发生时,如果正在处理的低级中断没有被完全处理完毕,高级中断可以打断低级中断处理过程,从而立即处理高级中断。一旦高级中断被处理完毕,处理器会返回到低级中断的处理程序继续执行。这种中断处理方式称为中断抢占,可以提高系统的响应速度和处理能力。
2.4假设系统有时钟中断、磁盘中断、键盘中断、鼠标中断,请设计它们的优先级,并说明理由。写出磁盘中断处理时,中断屏蔽寄存器应该有的设置值。
设计中断优先级如下:
-
时钟中断:优先级最高,因为它控制了整个系统的时间和调度,是系统的基础。
-
键盘中断:优先级次之,因为键盘输入是用户与系统交互的主要方式,需要及时响应用户的输入。
-
鼠标中断:优先级较低,因为鼠标输入相对键盘输入的频率较低,且不是必需的输入方式。
-
磁盘中断:优先级最低,因为磁盘访问通常需要较长时间的处理,不需要立即响应,而且磁盘中断可能会对其他中断的处理产生影响,需要谨慎处理。
磁盘中断处理时,中断屏蔽寄存器(Interrupt Mask Register)的设置值应该为:
- 禁止所有低于或等于磁盘中断优先级的中断,以确保磁盘中断能够被及时处理;
- 允许高于磁盘中断优先级的中断,以确保更高优先级的中断能够打断正在处理的磁盘中断。
-
具体来说,可以将中断屏蔽寄存器的设置值设置为一个二进制掩码,其中每一位表示一个中断的开关状态。当该位为1时,表示对应的中断被禁止;当该位为0时,表示对应的中断被允许。因此,在磁盘中断处理时,可以将中断屏蔽寄存器的值设置为低于磁盘中断优先级的位为1,高于磁盘中断优先级的位为0。这样可以保证磁盘中断能够被及时处理,同时也可以允许更高优先级的中断打断正在处理的磁盘中断。
2.5异常可以在核心态下发生吗?为什么?
异常可以在核心态下发生。
在现代计算机系统中,异常是指当CPU执行指令时发生的一些意外事件,例如除数为零、访问非法内存、保护性违规等。当这些意外事件发生时,CPU会暂停当前的指令执行,转而去执行异常处理程序,以保证系统的稳定和正确性。
异常可以在用户态下和核心态下发生,但是在核心态下处理异常更加方便和高效。因为在核心态下,操作系统可以直接访问系统的硬件资源和内存空间,能够更好地控制整个系统,处理异常时也可以直接修改硬件状态,不需要经过用户态和内核态之间的切换,避免了额外的时间和资源开销。此外,在核心态下,操作系统也可以更好地保护系统的安全性和隐私性,以及对异常进行更加细致的处理和调试。
因此,在现代计算机系统中,操作系统通常会将自己运行在核心态下,以便更好地处理异常和控制整个系统的运行。
2.6什么是中断向量?其内容是什么?试述中断的处理过程。
中断向量是指用来标识每个中断类型及其对应中断处理程序入口地址的一组固定的地址值。中断向量通常是存储在系统的中断向量表(Interrupt Vector Table)中,每个中断类型对应一个表项,表项中包含了该中断类型的中断向量和中断处理程序的入口地址。
中断向量的内容通常包括以下信息:
-
中断类型码:用来唯一标识每个中断类型。
-
中断服务程序入口地址:指向对应中断类型的中断处理程序的入口地址,该地址被保存在中断向量表中,当该中断类型的中断发生时,CPU会跳转到该地址执行中断处理程序。
中断的处理过程通常包括以下步骤:
-
中断发生:当某个硬件设备需要CPU的处理时,它会向CPU发送中断请求信号,触发中断发生。
-
中断响应:当CPU接收到中断请求信号后,会立即停止当前的任务执行,保存现场(将当前的CPU状态和程序计数器等寄存器的值保存到内存或栈中),并跳转到相应的中断处理程序的入口地址执行中断处理程序。
-
中断处理:中断处理程序会根据中断类型和具体的中断原因,进行相应的处理,如读取设备数据、响应用户输入等。处理完毕后,中断处理程序会执行中断返回指令,将CPU状态恢复到中断前的状态,并继续执行被中断的任务。此时CPU从中断返回,并恢复现场,回到被中断的任务执行的地方继续执行。
-
中断返回:中断返回指令会从栈或内存中恢复现场,包括程序计数器和其他寄存器的值,将CPU状态恢复到中断前的状态,回到被中断的任务执行的地方继续执行。如果有多个中断同时发生,CPU会根据中断优先级和中断屏蔽寄存器的设置,依次处理这些中断。
-
继续执行:CPU继续执行被中断的任务,直到下一个中断发生,重复以上的中断处理过程。
2.7中断/异常处理为什么要保存现场和恢复现场?现场应包括哪几方面的内容?哪些寄存器必须用硬件保存与恢复?现场信息可以全部用硬件保护和恢复吗?
中断/异常处理需要保存现场和恢复现场是为了确保当中断/异常发生时,CPU能够正确地恢复到原来的状态,从而使程序继续运行下去。
现场保存的内容包括:
-
程序计数器(PC):指向程序下一条要执行的指令的地址。
-
栈指针(SP):指向当前栈顶的地址。
-
段寄存器(Segment Register):指向当前程序段的地址。
-
通用寄存器(General Register):用来保存当前的程序运行状态和计算结果。
-
标志寄存器(Flag Register):用来保存程序的运行标志,如进位标志、溢出标志、零标志等。
-
浮点寄存器(Floating Point Register):用于保存浮点数运算的相关状态和结果。
-
状态寄存器(Status Register):用于保存CPU当前的运行状态,如用户态/核心态、中断允许标志、虚拟内存开关等。
必须用硬件保存和恢复的寄存器包括程序计数器、栈指针、状态寄存器和通用寄存器。
现场信息不仅包括CPU寄存器的内容,还包括内存中的数据和其他外设的状态。因此,现场信息不能全部用硬件保存和恢复,需要使用软件来保存和恢复这些信息。通常情况下,操作系统会在内存中为每个进程分配一块保存现场信息的区域,当中断/异常发生时,CPU会将寄存器的值和其他现场信息保存到该区域中,等到中断/异常处理结束后,再将现场信息从内存中恢复回来,以恢复原来的运行状态。
2.8操作系统的主要功能模块有哪些?如果采用微内核运行模式,那么,原来在内核中实现的功能,哪些功能可以在微内核中实现?哪些由用户态运行的进程实现?
操作系统的主要功能模块包括:
-
进程管理:创建和撤销进程、进程调度、进程通信等。
-
存储管理:内存分配和释放、虚拟内存管理、文件系统等。
-
设备管理:设备驱动程序、设备分配、设备管理等。
-
文件管理:文件读写、文件共享、文件保护、文件目录管理等。
如果采用微内核运行模式,原来在内核中实现的功能会被分为微内核和服务器进程两部分,其中微内核只提供最基本的功能,如进程管理、存储管理和设备管理等,而服务器进程则实现更高级别的功能,如文件系统和网络协议栈等。
在微内核中实现的功能包括:
这样的设计能够使得操作系统更加灵活、可扩展和可维护,同时也更加安全可靠,因为如果一个服务器进程出现了问题,不会影响到整个操作系统的运行,只需要重启该进程即可。
-
进程管理:创建和撤销进程、进程调度、进程通信等。
-
存储管理:内存分配和释放、虚拟内存管理等。
-
设备管理:设备驱动程序、设备分配、设备管理等。
而由用户态运行的进程实现的功能则包括:
-
文件管理:文件读写、文件共享、文件保护、文件目录管理等。
-
网络协议栈:网络协议的实现,如TCP/IP协议栈等。
-
用户界面:图形界面、窗口管理、用户输入等。
2.9从控制轨迹上看,系统调用和程序级的过程调用都相当于在断点处插入一段程序执行,但它们却有质的差别,试述两个方面的差别。
系统调用和程序级的过程调用虽然在控制轨迹上看起来类似,但它们存在着两个方面的质的差别:
权限和特权级别的不同:
系统调用是用户态进程向内核态发起请求,要求内核来完成某些特定的功能,因此在执行系统调用时需要切换特权级别,从用户态切换到内核态,这样才能访问受保护的内核资源。而程序级的过程调用则不涉及特权级别的切换,只是在当前进程内部的函数调用,仅涉及用户态。
执行的目的和影响范围的不同:
系统调用通常是为了完成一些操作系统层面的任务,如文件操作、进程管理等,它的目的是为了提供操作系统的服务和资源。而程序级的过程调用通常是为了实现具体的业务逻辑,它的目的是为了完成某个功能。另外,系统调用对整个系统具有影响,而程序级的过程调用仅对当前进程内部产生影响,不会影响到其他进程。
2.10操作系统主要有那些系统调用?
操作系统提供了许多系统调用,以允许应用程序与硬件进行交互并使用操作系统的服务。以下是一些常见的系统调用:
- 文件系统调用:open、close、read、write、seek、mkdir、rmdir、unlink 等。
- 进程控制调用:fork、exec、wait、exit、kill 等。
- 内存管理调用:brk、mmap、munmap、mprotect、mlock、munlock 等。
- 进程通信调用:pipe、shmget、shmctl、shmat、shmdt、msgget、msgsnd、msgrcv、semget、semctl、semop 等。
- 网络通信调用:socket、bind、listen、accept、connect、send、recv 等。
- 时间管理调用:time、gettimeofday、settimeofday、alarm、sleep 等。
当然,不同的操作系统可能会有一些独特的系统调用或者是对上述系统调用的不同实现方式。
2.11试述现代终端命令解释程序在什么态下运行,描述其处理流程。
现代终端命令解释程序通常在操作系统中作为一个进程运行。当用户在终端输入一个命令时,终端会将命令传递给操作系统,操作系统会将命令解释程序作为一个子进程运行,负责解释并执行用户的命令。
命令解释程序的处理流程通常分为以下几个步骤:
-
读取用户输入的命令:命令解释程序会从标准输入中读取用户输入的命令字符串。
-
解析命令:命令解释程序会解析用户输入的命令字符串,分离出命令和参数,并对命令进行语法和语义分析,以确定该如何执行这个命令。
-
执行命令:一旦命令解释程序确定了命令应该如何执行,它会调用相关的系统调用和库函数来执行命令。执行命令的过程中,命令解释程序会与操作系统内核进行交互,包括打开、读写文件、创建进程、发送信号等。
-
输出结果:命令解释程序会将命令执行的结果输出到标准输出或者其他指定的输出位置,供用户查看。
-
等待下一个命令:一旦命令执行完成,命令解释程序会等待用户输入下一个命令,或者等待操作系统发送一个信号通知它需要进行某些操作。
2.12子程序调用存的现场和中断异常处理时保存的现场有什么不同?
子程序调用保存现场和中断异常处理时保存现场的目的都是为了在执行完子程序或者中断处理程序之后,能够回到原来的执行现场并继续执行下去。然而,它们保存的现场有一些不同之处:
-
子程序调用保存现场:当程序执行到一个子程序的调用语句时,程序会暂停执行,并将当前的程序计数器和其他寄存器的值压入栈中保存。子程序会从栈中读取这些值,并在执行完后将控制返回到调用程序的下一条指令处。这样可以保证子程序执行完后,能够正确地回到调用程序并继续执行下去。文章来源:https://www.toymoban.com/news/detail-720532.html
-
中断异常处理保存现场:当中断或异常发生时,处理器会暂停当前程序的执行,并将当前的程序计数器、处理器状态以及其他寄存器的值保存到堆栈或其他指定的地方。中断或异常处理程序会从堆栈或其他指定的地方读取这些值,并在执行完后将控制返回到中断或异常发生的地方。这样可以保证在中断或异常处理程序执行完后,能够回到原来的执行现场并继续执行下去。文章来源地址https://www.toymoban.com/news/detail-720532.html
到了这里,关于操作系统(第5版罗宁 文艳军编著)第二章课后习题答案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!