启动、中断、异常和系统调用练习题

1、下列选项中,不可能在用户态发生的是( )

A 系统调用

B 外部中断

C 进程切换

D 缺页

2、中断处理和子程序调用都需要压栈以保护现场。中断处理一定会保存而子程序调用不需要保存其内容的是( )

A 程序计数器

B 程序状态字寄存器

C 通用数据寄存器

D 通用地址寄存器

 

启动、中断、异常和系统调用练习题

4、下列选项中, ____可以执行特权指令?()

A 中断处理例程

B 普通用户的程序

C 通用库函数

D 管理员用户的程序

5、用户程序通过____向操作系统提出访问外部设备的请求()

A I/O指令

B 系统调用

C 中断

D 创建新的进程

6、应用程序引发异常的时候,操作系统可能的反应是()

A 删除磁盘上的应用程序

B 重启应用程序

C 杀死应用程序

D 修复应用程序中的错误

 

启动、中断、异常和系统调用练习题


8、操作系统处理中断的流程包括____()

A 保护当前正在运行程序的现场

B 分析是何种中断,以便转去执行相应的中断处理程序

C 执行相应的中断处理程序

D 恢复被中断程序的现场

9、下列程序工作在内核态的有____()

A 系统调用的处理程序

B 中断处理程序

C 进程调度

D 内存管理

 

系统调用是提供给应用程序使用的,由用户态发出,进入内核态执行。外部中断随时可能发生;应用程序执行时可能发生缺页;进程切换完全由内核来控制。

程序状态字(PSW)寄存器用于记录当前处理器的状态和控制指令的执行顺序,并且保留与运行程序相关的各种信息,主要作用是实现程序状态的保护和恢复。所以中断处理程序要将PSW保存,子程序调用在进程内部执行,不会更改PSW。

中断处理例程(也可称为中断处理程序)需要执行打开中断,关闭中断等特权指令,而这些指令只能在内核态下才能正确执行,所以中断处理例程位于操作系统内核中。而1,3,4都属于用户程序和用于用户程序的程序库。 以ucore OS为例,在lab1中就涉及了中断处理例程,可查看intr_enable,sti,trap等函数完成了啥事情?被谁调用了?

5、具体内容可参见10.的回答。 以ucore OS为例,在lab5中有详细的syscall机制的设计实现。比如用户执行显示输出一个字符的操作,由于涉及向屏幕和串口等外设输出字符,需要向操作系统发出请求,具体过程是应用程序运行在用户态,通过用户程序库函数cputch,会调用sys_putc函数,并进一步调用syscall函数(在usr/libs/syscall.c文件中),而这个函数会执行“int 0x80”来发出系统调用请求。在ucore OS内核中,会接收到这个系统调用号(0x80)的中断(参见 kernel/trap/trap.c中的trap_dispatch函数有关 “case T_SYSCALL:”的实现),并进一步调用内核syscall函数(参见 kernel/syscall/syscall.c中的实现)来完成用户的请求。内核在内核态(也称特权态)完成后,通过执行“iret”指令(kernel/trap/trapentry.S中的“__trapret:”下面的指令),返回到用户态应用程序发出系统调用的下一条指令继续执行应用程序。

6、更合适的答案是3。因为应用程序发生异常说明应用程序有错误或bug,如果应用程序无法应对这样的错误,这时再进一步执行应用程序意义不大。如果应用程序可以应对这样的错误(比如基于当前c++或java的提供的异常处理机制,或者基于操作系统的信号(signal)机制(后续章节“进程间通信”会涉及)),则操作系统会让应用程序转到应用程序的对应处理函数来完成后续的修补工作。 以ucore OS为例,目前的ucore实现在应对应用程序异常时做的更加剧烈一些。在lab5中有有对用户态应用程序访问内存产生错误异常的处理(参见 kernel/trap/trap.c中的trap_dispatch函数有关 “case T_PGFLT: ”的实现),即ucore判断用户态程序在运行过程中发生了内存访问错误异常,这是ucore认为重点是查找错误,所以会调用panic函数,进入kernel的监控器子系统,便于开发者查找和发现问题。这样ucore也就不再做正常工作了。当然,我们可以简单修改ucore当前的实现,不进入内核监控器,而是直接杀死进程即可。你能完成这个修改吗?

8、中断是异步产生的,会随时打断应用程序的执行,且在操作系统的管理之下,应用程序感知不到中断的产生。所以操作系统需要保存被打断的应用程序的执行现场,处理具体的中断,然后恢复被打断的应用程序的执行现场,使得应用程序可以继续执行。 以ucore OS为例(lab5实验),产生一个中断XX后,操作系统的执行过程如下: vectorXX(vectors.S)--> __alltraps(trapentry.S)-->trap(trap.c)-->trap_dispatch(trap.c)-->-->……具体的中断处理-->__trapret(trapentry.S) 通过查看上述函数的源码,可以对应到答案1-4。另外,需要注意,在ucore中,应用程序的执行现场其实保存在trapframe数据结构中。

9、这里说的“程序”是一种指称,其实就是一些功能的代码实现。而1-4都是操作系统的主要功能,需要执行相关的特权指令,所以工作在内核态。 以ucore OS为例(lab5实验),系统调用的处理程序在kern/syscall目录下,中断处理程序在kern/trap目录下,进程调度在kern/schedule目录下,内存管理在kern/mm目录下