跳到主要内容

用户态和内核态

· 阅读需 3 分钟
素明诚
Full stack development

用户态

用户态是普通的程序运行模式,例如你的文档编辑器或游戏。

在用户态,程序有限制地访问计算机的资源,比如不能直接控制硬件设备。

这样做的好处是保证了系统的安全,防止程序随意修改关键的系统信息或其他程序的数据。

内核态

内核态是操作系统运行的模式,它有权访问计算机的所有资源,包括内存和外设。

当操作系统需要执行重要的任务,如管理内存或响应硬件请求时,它会在内核态下运行。

这种模式可以让操作系统有效地控制硬件和管理系统资源。

从用户态切换到内核态的情况

系统调用:当你的程序需要操作系统帮助完成一些特定任务(比如读取文件)时,它会通过系统调用请求操作系统的服务,此时会从用户态切换到内核态。

异常:如果程序运行出错(如试图访问未授权的内存区域),系统会自动切换到内核态来处理这个错误,防止程序崩溃。

外部中断:当外围设备(如打印机、键盘)完成任务时,会通知 CPU,这时候系统也会切换到内核态来处理这些外部事件。

切换的过程

在操作系统中,“切换”通常指的是 CPU 从用户态切换到内核态的过程。

外部中断发生:当外围设备(如打印机或键盘)完成任务或需要系统处理某些事情(比如用户按下了键盘上的一个键),设备会向 CPU 发送一个中断信号。

中断信号的接收:CPU 接收到这个中断信号后,会当前暂停正在执行的用户态程序的运行。

状态的切换:CPU 将控制权转移给操作系统的中断处理程序,这通常涉及到从用户态切换到内核态。因为内核态允许执行访问硬件和执行中断服务例程等操作。

执行中断服务例程:一旦在内核态,操作系统的中断服务例程(ISR)就会开始执行,处理来自外部设备的请求或响应。例如,如果是键盘产生的中断,ISR 可能会读取键盘缓冲区中的数据。

返回用户态:中断处理完成后,操作系统会将 CPU 的状态从内核态切换回用户态,继续执行之前被中断的程序。

为什么要有用户态和内核态?

由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络