用户态和内核态的区别

特权级

操作系统有特权级,一般是4级,分别为0-3,0级权限最高,3级权限最低。操作系统中核心的任务交给特权级高的进程完成,这样可以做到集中管理,减少有限资源的访问和使用冲突。

用户态和内核态的概念

当一个进程在执行用户自己的代码的时候,他运行在用户态中,此时的特权级最低,为ring3,是普通用户进程运行的特权级,大部分普通用户面对的程序都运行在用户态。ring3不能访问ring0的地址空间,包括代码和数据。当一个进程运行在内核态中,比如进行系统调用的时候,它的特权级最高,为ring0,执行的内核代码会使用当前进程的内核栈,每一个进程都有自己的内核栈

用户态和内核态之间的切换

系统调用

这是用户态进程主动要求进入内核态的方式。用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。例如fork()就是创建一个新的进程的系统调用。系统调用的核心机制是使用操作系统为用户特别开放的一个中断来实现。

异常

CPU在执行用户态程序时,如果发生了一些不可预知的异常,这时就会触发由当前运行进程切换到此异常相关的内核进程中,也就是切换到了内核态,比如缺页异常

外围设备的中断

当外围设备完成用户请求的操作以后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序。如果之前的指令处于用户态,那么这个转换过程就是从用户态到内核态的一个转换过程。比如硬盘读写完成,系统会切换到硬盘读写的中断处理程序中执行后续操作。

切换步骤

  • 首先获取内核栈的基本信息,栈顶栈底
  • 然后用内核栈保存当前进程的上下文基本信息,比如指令计数器等,这个过程就完成了用户态到内核态的切换
  • 将之前由中断向量得到的中断处理程序的指令信息存入相应的寄存器,开始执行中断处理程序,此时就是内核态的程序执行了
  • 最后当内核态的程序执行完毕,通过内核栈中用户进程的上下文信息恢复用户进程的执行,这个过程就相当于调用函数完成,函数返回。
posted @ 2020-11-13 08:06  胖胖咩  阅读(630)  评论(0)    收藏  举报