用户空间和内核空间
都是虚拟内存,但是从逻辑上由操作系统进行了划分,比如Linux 32位系统有4G虚拟内存,用户空间代表0-3G的内存地址,内核空间代表3-4G的内存地址。
这样能够做到数据隔离,互不干扰,同时对访问进行控制,防止系统内核的数据被用户影响。
用户态和内核态
CPU将指令分为特权指令和非特权指令,按照特权等级,指令分为4级:Ring0-Ring3,由高到低。Linux系统只运用了Ring0和Ring3两个等级。
每个进程在用户空间和内核空间各有一个栈,用来执行用户代码/内核代码。在内核空间有内核栈,在用户空间除了用户栈,还有堆。不同进程的用户空间,是分开的,不可共享,但是所有进程共用一个内核空间
一个进程在执行用户代码(应用程序的代码)时,为用户态。此时进程运行在用户空间,指令等级为Ring3。
一个进程在执行内核代码时,为内核态。此时进程运行在内核空间,指令等级为Ring0。
用户态如何切换到内核态(其实就是切换进程的上下文)
1、系统调用(主动)。调用系统服务对外提供的接口
2、异常(软中断)(被动)。用户态发生异常时,需要系统内核相关进程来处理此异常
3、硬件中断(被动)。硬件设备完成操作后,会向CPU发送中断信号,如果此时CPU在用户态,则会切换到内核态去执行中断处理程序
上下文
简单说就是环境。进程的上下文,表示进程执行时的环境。说白了就是能表示进程当前状态的所有参数,包括CPU的所有寄存器中的值、进程的状态以及堆栈中的内容等。进程的上下文保存在进程的任务数据结构中。
内核态运行于两种环境,进程上下文和中断上下文。
进程上下文
=用户态通过系统调用传递给内核的参数+进程的上下文。
中断上下文
=硬件中断/软中断传递给内核的参数+进程的上下文。