开发者社区> 问答> 正文

为什么要区分用户态与内核态?

为什么要区分用户态与内核态?

展开
收起
游客4ztx2pti3xtdw 2022-03-31 15:17:26 737 0
1 条回答
写回答
取消 提交回答
  • 在 CPU 的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。如果所有的程序都能使用这些指令,那么你的系统一天死机N回就不足为奇了。所以, CPU 将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令。 Intel 的 CPU 将特权级别分为4个级别: RING0 、 RING1 、 RING2 、 RING3 。

    ​ 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。

    当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。 当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。 ​ 当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。 Linux 使用了 Ring3 级别运行用户态, Ring0 作为 内核态,没有使用 Ring1 和 Ring2 。 Ring3 状态不能访问 Ring0 的地址空间,包括代码和数据。 Linux 进程的 4GB 地址空间,3G-4G部分大家是共享的,是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据。用户运行一个程序,该程序所创建的进程开始是运 行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过 write , send 等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必 须切换到 Ring0 ,然后进入 3GB-4GB 中的内核地址空间去执行这些代码完成操作,完成后,切换回 Ring3 ,回到用户态。

    这样,用户态的程序就不能 随意操作内核地址空间,具有一定的安全保护作用。

    处理器总处于以下状态中的一种:

    1、内核态,运行于进程上下文,内核代表进程运行于内核空间; 2、内核态,运行于中断上下文,内核代表硬件运行于内核空间; 3、用户态,运行于用户空间。

    2022-03-31 15:18:09
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载