文章目录
- 内核态(Kernel Mode)
- 用户态(User Mode)
- 用户态和内核态之间的切换
- 为什么要切换
- 如何切换
- 系统调用
- 硬件中断
- 异常处理
为了使操作系统内核提供⼀个⽆懈可击的进程抽象,处理器必须提供⼀种机制, 限制⼀个应⽤可以执⾏的指令以及他可以⽤来访问的地址空间范围。 处理器通常是⽤某个控制寄存器中的⼀个 模式位来提供这种功能的,该寄存器描述了进程当前享有的特权。
当设置了模式位时:进程就运⾏在内核态中。运⾏在内核态中的进程可以执⾏指令集中的任何指令,并且可以访问系统中的任何内存位置。
没有设置模式位时: 进程就运⾏在⽤户态。⽤户模式中的进程不允许执⾏特权指令。
内核态(Kernel Mode)
- 定义与权限:内核态是操作系统代码运行的一种模式,具有访问系统所有资源的权限。在这个状态下,代码有权访问硬件设备、内存管理功能、文件系统和其他核心管理功能。
- 安全与效率:内核态提供了对硬件的直接控制能力,这意味着运行在内核态的代码必须是高度可信的,因为错误的操作可能导致系统崩溃或安全问题。操作系统的核心组件(如调度器、内存管理器)运行在内核态,以高效管理硬件资源和执行关键的系统任务。
- 限制访问:普通用户程序通常不允许直接运行在内核态,防止误操作或恶意软件破坏系统稳定性和安全性。
用户态(User Mode)
- 定义与权限:用户态是指那些运行用户程序的模式,这些程序不能直接执行硬件操作或访问受保护的内存区域。用户态程序通常通过系统调用请求操作系统提供的服务,如读写文件、发送网络数据等。
- 安全隔离:用户态为系统提供了一种安全机制,确保用户程序不能直接干扰系统操作或访问其他程序的数据。这种隔离保护了系统的稳定性和安全性。
- 系统调用:当用户程序需要执行一项不能直接在用户态完成的操作时,它会执行一个系统调用。系统调用是一种软件中断,通知操作系统代表用户程序执行某项功能。操作系统接收到调用后,会切换到内核态来执行请求的服务,完成后再返回到用户态继续用户程序的执行。
用户态和内核态之间的切换
为什么要切换
一般来说,一个进程运行在内核态是不安全的,因为错误的操作可能导致操作系统崩溃
操作系统需要在用户态和内核态之间切换,以提供既安全又高效的计算环境。用户程序在大多数时间内运行在用户态,当它需要操作系统服务(如文件访问、网络通信)时,通过系统调用切换到内核态。
如何切换
对于某个进程而言,它可能会在运行过程中在用户态和内核态之间来回切换。这种切换通常发生在进程执行系统调用、处理硬件中断或响应操作系统的异常处理时。下面是几种典型情况,它们会导致进程从用户态切换到内核态:
系统调用
当一个进程需要执行某些不能直接在用户空间完成的操作时(如文件操作、网络请求或访问某些硬件资源),它会执行一个系统调用。系统调用是一种程序接口,由操作系统提供,允许用户程序请求操作系统为其提供服务。执行系统调用会导致进程从用户态切换到内核态,操作系统接管控制权,完成请求的服务,然后将控制权返回给用户程序,同时切换回用户态。
硬件中断
当硬件设备(如键盘、网络接口卡等)完成其任务或需要注意时,会向CPU发送中断信号。CPU接收到中断后会暂停当前执行的进程,切换到内核态处理中断。处理完毕后,操作系统会将CPU控制权返回给之前的进程,进程可能会继续在用户态运行或根据情况再次进入内核态。
异常处理
在执行过程中,如果进程遇到错误或异常情况(如试图访问未分配的内存区域),操作系统会介入,将执行切换到内核态以处理这些异常。异常处理完成后,根据异常的性质,操作系统可能会让进程继续运行、终止进程或将其挂起。