用户态和内核态 中断处理机制

简介: 用户态和内核态 中断处理机制

操作系统

一、操作系统基础知识

1.1 用户态和内核态

1.1.1 定义:什么是用户态和内核态?

Kernel 运行在超级权限模式(Supervisor Mode)下,所以拥有很高的权限。按照权限管理的原则,多数应用程序应该运行在最小权限下。因此,很多操作系统,将内存分成了两个区域:

  • 内核空间(Kernal Space),这个空间只有内核程序可以访问;
  • 用户空间(User Space),这部分内存专门给应用程序使用。

1.1.2 用户态和内核态

用户空间中的代码被限制了只能使用一个局部的内存空间,我们说这些程序在用户态(User Mode) 执行。

内核空间中的代码可以访问所有内存,我们称这些程序在内核态(Kernal Mode) 执行。

系统调用过程

如果用户态程序需要执行系统调用,就需要切换到内核态执行。下面我们来讲讲这个过程的原理。

如上图所示:内核程序执行在内核态(Kernal Mode),用户程序执行在用户态(User Mode)。当发生系统调用时,用户态的程序发起系统调用。因为系统调用中牵扯特权指令,用户态程序权限不足,因此会中断执行,也就是 Trap(Trap 是一种中断)。

发生中断后,当前 CPU 执行的程序会中断,跳转到中断处理程序。内核程序开始执行,也就是开始处理系统调用。内核处理完成后,主动触发 Trap,这样会再次发生中断,切换回用户态工作。

1.2 中断

1.2.1 中断机制的产生

早期计算机各个程序只能串行执行、系统资源利用低。为了解决上述问题,人们就发明了操作系统,引入了中断机制,实现了多道程序的并发执行,提高了系统资源的利用率。

中断是多程序并发执行的前提条件。

(1) 以两个进程并发运行为例,进程1在用户态运行了一段时间后,CPU会接收到计时部件(操作系统内核的时钟管理部件)发出的中断信号,表示进程1已经用完了一个时间片,CPU会切换到内核态,把CPU的使用权限交还给操作系统,操作系统内核就会对刚才的中断进行处理,操作系统知道进程1的时间片用完,就需要切换进程,在完成切换进程的一系列工作后,操作系统又会将CPU的使用权交还给用户进程。

(2) 接着进程2拿到CPU执行权就会在用户态下执行,进程2执行一段时间后,进程2发出系统调用(内中断信号),请求输出,主动要求操作系统介入工作,CPU会立即切换到内核态,把权限交还给操作系统,操作系统内核接管进程2系统调用请求,调用IO设备开始输出工作,然后操作系统交还CPU执行权,IO设备也会并行执行,进程2需要等待IO操作完成,所以进程1拿到CPU执行权开始运行。当执行一段时间后,IO操作完成,IO设备向CPU发送一个中断信号,此时CPU由用户态再次转换为内核态,对刚才的中断信号处理,由于IO操作完成,所以操作系统知道进程2可以恢复运行了,以完成后续工作,所以操作系统再次交还CPU执行权,让进程2再次运行。

(1) 当中断发生时,CPU立即进入内核态。

(2) 当中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进程处理。

(3) 对于不同的中断信号,会进行不同的处理。

1.2.2 中断的本质

发生中断就意味着需要操作系统介入,开展管理工作。

当发生了中断,就意味着需要操作系统的介入,开展管理工作。由于操作系统的管理工作(**如进程切换、分配IO设备)需要使用特权指令,因此CPU要从用户态转换为核心态。**中断就可以使CPU从用户态转换为核心态,使操作系统获得计算机的控制权。因此,有了中断,才能实现多道程序并发执行。

用户态到核心态的转换就是通过中断机制实现的,并且中断是唯一途径。

核心态到用户态的切换时通过执行一个特权指令,将程序状态字(PSW)标志位设置为用户态。

1.2.3 中断的分类

1.2.3.1 内中断和关中断

中断可以分为:内中断和外中断。

内中断:内中断的信号来源于CPU内部、与当前执行的指令有关。如整数除0。

  • 除数为零、操作数溢出等算术异常:简单处理,报告用户;也可以由用户编写中断续元程序处理
  • 非法指令、用户态使用特权指令、地址越界、非法存取等指令异常:终止进程
  • 终止进程指令:终止进程
  • 虚拟地址异常:调整内存后重新执行指令
    外中断:外中断的信号来源于CPU外部、与当前执行的指令无关。如用户强制结束一个进程、IO设备完成操作发生的中断信号。
  • 由外围设备发出的信号引起的中断事件
  • 时钟中断、间隔时钟中断:记时与时间片处理
  • 设备报到与结束中断:调整设备表
  • 键盘/鼠标信号中断:根据信号做出相应反映
  • 关机/重启动中断:写回文件,停止设备与CPU
1.2.3.2 开中断和关中断

关中断和开中断其实就是像我们生活中的开关一样。 关中断是为了保护一些不能中途停止执行的程序而设计的,计算机的CPU进行的是时分复用,即每个时钟周期内,CPU只能执行一条指令。在多道程序设计的环境下(就是我们通常所说的多个程序同时运行时),CPU是不断地交替地将这些程序的指令一条一条的分别执行,这样从宏观上看我们就感觉多个程序是在同时执行,但从微观上看则是CPU在不同的时间段(极短)内执行着不同程序的单条指令。而CPU在这些指令之间的切换就是通过中断来实现的。

关中断就是为了让CPU在一段时间内执行同一程序的多条指令而设计的,比如在出现了非常事件后又恢复正常时,CPU就会忙于恢复非常事件出现之前计算机的工作环境(通常叫做恢复现场),在恢复现场的时候,CPU是不允许被其他的程序打扰的,此时就要启动关中断,不再相应其他的请求。当现场恢复完毕后,CPU就启动开中断,其他等待着的程序的指令就开始被CPU执行,计算机恢复正常。

1.2.4 中断的处理过程

  • 情况一:对于某些中断,在处理完毕后,直接返回刚刚被中断的进程
  • 情况二:对于其他一些中断,要中断当前进程的运行,调整进程队列,启动进程调度,选择下一个执行的进程并恢复其执行
    (1) 执行完每个指令后,CPU都要检查当前是否有外部中断信号。
    (2) 如果检测到外部中断信号,则需要保护被中断进程的CPU环境(如程序状态字PSW、程序计数器、各种通用寄存器)。
    (3) 根据中断信号类型转入相应的中断处理程序。
    (4) 恢复进程的CPU环境并退出中断,返回原进程继续往下执行。

【中断屏蔽】

  • 当计算机检测到中断时,中断装置通过中断屏蔽位决定是否响应已发生的中断
  • 有选择的响应中断

【中断优先级】

  • 当计算机同时检测到多个中断时,中断装置响应中断的顺序
  • 有优先的的响应中断
  • 一种可能的处理次序
  • 处理机硬件故障中断事件、自愿性中断事件、程序性中断事件、时钟中断等外部中断事件、输入输出中断事件、重启动和关机中断事件
  • 不同类型的操作系统有不同的中断优先级

【中断的嵌套处理】

  • 当计算机响应中断后,在中断处理过程中,可以再响应其他中断
  • 操作系统是性能攸关程序,且中断响应处理有硬件要求,考虑系统效率和实现代价问题,中断的嵌套处理应限制在一定层数内,如3层
  • 中断的嵌套处理改变中断处理次序,先响应的有可能后处理

【多中断的响应与处理】

  • 决定中断处理次序的因素
  • 中断屏蔽可以使中断装置不响应某些中断
  • 中断优先级决定了中断装置响应中断的次序
  • 中断可以嵌套处理,但嵌套的层数应有限制
  • 中断的嵌套处理改变了中断处理的次序

【多重中断处理-1】

  • X、Y两个中断同时发生
  • 先响应X
  • 因Y被屏蔽,继续处理X
  • 再响应并处理Y

【多重中断处理-2】

  • X、Y两个中断同时发生
  • 根据中断优先级,先响应X
  • 因未屏蔽Y,再响应并处理Y
  • Y处理完成后,再处理X

1.2.5 中断、异常和系统异常区别

  • 狭义的中断来源于处理器之外的中断事件,即与当前运行指令无关的中断事件,如I/O中断、时钟中断、外部信号中断等
  • 异常(来源于CPU内部的中断事件,和狭义共同构成广义的中断)指当前运行指令引起的中断事件,如地址异常、算术异常、处理器硬件故障等
  • 系统异常与硬件无关,系统异常指执行陷入指令而触发系统调用引起的中断事件,如请求设备、请求I/O、创建进程等

1.2.5 总结

(1) 中断是为了实现多道程序并发执行而引入的一种技术。

(2) 中断的本质就是发生中断时需要操作系统介入开展管理工作。

(3) 发生CPU会立即进入核心态,针对不同的中断信号,采取不同的处理方式。

(4) 中断是CPU从用户态进入核心态的唯一途径。

(5) 中断分为内中断和外中断。

(6) 进程中断时,操作系统会保存CPU的运行环境,如程序状态字(PSW)、程序计数器、各种通用寄存器,这是为了当进程再次运行时可以从中断的状态处继续运行。


相关文章
|
2月前
|
资源调度 调度 UED
CPU执行系统调用时发生中断,操作系统还能切回中断前的系统调用继续执行吗?
系统调用服务例程在执行过程中,通常不会被中断。系统调用服务例程的执行是一个原子操作,即在执行期间不会被中断。这是为了确保在系统调用服务例程执行期间对内核数据结构的一致性和完整性。
|
3月前
|
编译器 C语言 芯片
内核里的中断
内核里的中断
34 0
|
3月前
|
Linux
Linux进程与线程的内核实现
task_struct称为进程描述符结构,该结构定义在文件中。进程描述符中包含一个具体进程的所有信息 进程描述符中包含的数据能完整地描述一个正在执行的程序:它打开的文件,进程的地址空间,挂起的信号,进程的状态等
38 0
Linux进程与线程的内核实现
|
4月前
|
存储 安全 数据中心
系统调用与用户态陷入内核态
我们都知道操作系统中运行着很多的进程,如果普通的进程可以直接操作硬件那么这个系统的安全性没办法保障,所以操作系统分出了两种状态,一种状态是运行的代码可以操作硬件;一种状态不能操作硬件,只能切换到第一种状态去操作后再切换回来,这就是内核态和用户态。
|
6月前
|
安全 Linux C++
操作系统:用户态与内核态
操作系统:用户态与内核态
|
9月前
|
算法 Linux 调度
进程原理及其系统调用(上)
进程原理及其系统调用
92 0
|
9月前
|
Unix Linux
进程原理及其系统调用(下)
进程原理及其系统调用
56 0
|
存储 消息中间件 算法
操作系统学习笔记_2 中断和系统调用;进程和线程
学习自计算机科学单本&b站王道课程。
118 0
操作系统学习笔记_2 中断和系统调用;进程和线程
|
Linux
Linux进程间软中断通信
Linux进程间软中断通信
163 0
Linux进程间软中断通信
|
Linux 安全
用户态和内核态的区别
在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。如果所有的程序都能使用这些指令,那么你的系统一天死机n回就不足为奇了。
2475 0