并发编程(二十六)内核态和用户态

214 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情

1.含义

简单来说内核态就是操作系统运行线程,用户态就是线程执行用户自己的程序。

以下为官方定义:

内核态

  1. 系统中既有操作系统的程序,也有普通用户程序。为了安全性和稳定性,操作系统的程序不能随便访问,这就是内核态。即需要执行操作系统的程序就必须转换到内核态才能执行!

  2. 内核态可以使用计算机所有的硬件资源!

用户态

不能直接使用系统资源,也不能改变 CPU 的工作状态,并且只能访问这个用户程序自己的存储空间!

当一个进程在执行用户自己的代码时处于用户运行态(用户态),此时特权级最低,为 3 级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。Ring3 状态不能访问 Ring0 的地址空间,包括代码和数据;当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态),此时特权级最高,为 0 级。执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。

2.为什么区分内核态和用户态呢

为了数据的安全性,防止不同的程序获取更多的权限,导致操作不当、获取其他程序内存数据、获取外围设备数据。发送网络信息等。因此划分了不2种不同的操作权限:用户态、内核态

3.何时进入“内核态”?

用户在运行自己的程序时,都是进入用户态在执行程序的代码。如果要进行文件操作、网络数据的发送等操作必须通过 系统调用,这些代码就会使用到内核态代码。进程会切换到 Ring0,然后进入内核地址空间去执行内核代码来完成相应的操作。内核态的进程执行完后又会切换到 Ring3,回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。这说的保护模式是指通过内存页表操作等机制,保证进程间的地址空间不会互相冲突,一个进程的操作不会修改另一个进程地址空间中的数据。