用户态和内核态的区别

1.操做系统须要两种CPU状态

内核态(Kernel Mode):运行操做系统程序,操做硬件数据结构

用户态(User Mode):运行用户程序函数

2.指令划分

特权指令:只能由操做系统使用、用户程序不能使用的指令。 举例:启动I/O 内存清零 修改程序状态字 设置时钟 容许/禁止终端 停机spa

非特权指令:用户程序可使用的指令。 举例:控制转移 算数运算 取数指令 访管指令(使用户程序从用户态陷入内核态)操作系统

3.特权级别

特权环:R0、R一、R2和R3对象

R0至关于内核态,R3至关于用户态;进程

不一样级别可以运行不一样的指令集合;内存

4.CPU状态之间的转换

**用户态--->内核态:**惟一途径是经过中断、异常、陷入机制(访管指令)终端

**内核态--->用户态:**设置程序状态字PSW硬件

5.内核态与用户态的区别

  • 内核态与用户态是操做系统的两种运行级别,当程序运行在3级特权级上时,就能够称之为运行在用户态。由于这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;请求

  • 当程序运行在0级特权级上时,就能够称之为运行在内核态。

  • 运行在用户态下的程序不能直接访问操做系统内核数据结构和程序。当咱们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其须要操做系统帮助完成某些它没有权力和能力完成的工做时就会切换到内核态(好比操做硬件)。

  • 这两种状态的主要差异是

    • 处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理器是可被抢占的
    • 处于内核态执行时,则能访问全部的内存空间和对象,且所占有的处理器是不容许被抢占的。

6. 一般来讲,如下三种状况会致使用户态到内核态的切换

  • 系统调用

这是用户态进程主动要求切换到内核态的一种方式,**用户态进程经过系统调用申请使用操做系统提供的服务程序完成工做。**好比前例中fork()实际上就是执行了一个建立新进程的系统调用。

而系统调用的机制其核心仍是使用了操做系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。

用户程序一般调用库函数,由库函数再调用系统调用,所以有的库函数会使用户程序进入内核态(只要库函数中某处调用了系统调用),有的则不会。

  • 异常

当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换处处理此异常的内核相关程序中,也就转到了内核态,好比缺页异常。

  • 外围设备的中断

当外围设备完成用户请求的操做后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,

若是先前执行的指令是用户态下的程序,那么这个转换的过程天然也就发生了由用户态到内核态的切换。好比硬盘读写操做完成,系统会切换到硬盘读写的中断处理程序中执行后续操做等。

这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用能够认为是用户进程主动发起的,异常和外围设备中断则是被动的。

相关文章
相关标签/搜索