一.用户态和核心态的概念
用户态
用户态和核心态是操作系统的两种运行级别,当系统运行在3级特权级上时,就可以称之为运行在用户态,因为这事最低权限级,是普通用户运行的权限级,大部分用户直接面对的的程序都是运行在用户态。在手机上表现就是:只能管理自己的App,如果想要操作硬件,需要调用系统的库函数,且部分功能操作不了,操作硬件,比如网卡。
核心态
当程序运行在0级特权级上时,可以称之为运行在核心态,核心态可以直接访问操作系统内核数据结构和程序,而用户态不行。在手机上的表现就是:可以管理整台手机
二.用户态和核心态的区别
一句话就是权限不同。处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理机是可被抢占的。而处于核心态执行的进程,则能访问所有的内存空间和对象,其所处于占有的处理机不可被抢占。
三.为啥要区别
是为了区别执行特权指令和非特权指令。在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。如果所有的程序都能使用这些指令,那么你的系统一天死机n回就不足为奇了。所以,CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令。
四.二者之间如何切换
系统调用
这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
中断
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
中断
当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
参考文章:https://blog.csdn.net/ludan_xia/article/details/105695961