【简述】
内核态(Kernel Mode) 和 用户态(User Mode) 实际上是指 2 种不同的访问权限。
x86处理器包含 4 个不同的特权等级,分别是 Ring0~Ring3。Ring0下,可以执行特权级指令,对任何 I/O 设备都有访问权限,Ring3则被限制很多操作。
在使用 x86处理器的设备上,用户代码运行在 Ring3,系统内核代码运行在 Ring0。
【区别】
内核态:CPU可以访问内存所有数据,包括外围设备,例如硬盘,网卡。CPU也可以将自己从一个程序切换到另一个程序。
用户态:只能受限的访问内存,且不允许访问外围设备。占用CPU的能力被剥夺,CPU资源可以被其他程序获取。
【划分原因】
防止进程获取别的程序的内存数据,或者获取外围设备的数据,并发送到网络。
【状态切换】
有 3种方式可以实现状态的切换。
1、系统调用:
所有用户程序都运行在用户态,当要进行从键盘输入数据或从硬盘读取数据这些内核态操作时,需要向操作系统请求以程序的身份执行这些操作。
这时用户态程序切换到内核态,但是不能控制在内核态中执行的指令。
这个过程称作系统调用,在CPU中的实现称之为陷阱指令(Trap Instruction)。
2、外围设备中断:
CPU接收到中断信号时会暂停执行当前命令,转而执行中断信号对应的处理程序。
因为中断的处理属于内核态,如果CPU在处理中断前处于用户态,那么将发生状态切换。
典型的例子是硬盘读写。
3、异常:
CPU在用户态下运行程序时发生了异常,会转到一个处理异常的内核相关程序中,也会导致用户态到内核态的转换。
比如,缺页异常。
【执行步骤】
1、用户态程序将一些数据值放在寄存器中,或者使用参数创建一个栈帧(Stack Frame)。这些数据说明了需要操作系统提供的服务。
2、用户态程序执行陷阱指令。
3、CPU切换到内核态开始执行位于内存指定位置的指令。这些指令属于操作系统的一部分,具有内存保护,不可被用户程序访问。
4、这些指定位置上的指令被称为陷阱(Trap)或者系统调用句柄(System Call Handler)。她们会读取程序放入内存的数据参数并执行程序请求任务。
5、系统调用完成后,操作系统会重置CPU为用户态并将系统调用的结果返回。
内核态(Kernel Mode) 和 用户态(User Mode) 实际上是指 2 种不同的访问权限。
x86处理器包含 4 个不同的特权等级,分别是 Ring0~Ring3。Ring0下,可以执行特权级指令,对任何 I/O 设备都有访问权限,Ring3则被限制很多操作。
在使用 x86处理器的设备上,用户代码运行在 Ring3,系统内核代码运行在 Ring0。
【区别】
内核态:CPU可以访问内存所有数据,包括外围设备,例如硬盘,网卡。CPU也可以将自己从一个程序切换到另一个程序。
用户态:只能受限的访问内存,且不允许访问外围设备。占用CPU的能力被剥夺,CPU资源可以被其他程序获取。
【划分原因】
防止进程获取别的程序的内存数据,或者获取外围设备的数据,并发送到网络。
【状态切换】
有 3种方式可以实现状态的切换。
1、系统调用:
所有用户程序都运行在用户态,当要进行从键盘输入数据或从硬盘读取数据这些内核态操作时,需要向操作系统请求以程序的身份执行这些操作。
这时用户态程序切换到内核态,但是不能控制在内核态中执行的指令。
这个过程称作系统调用,在CPU中的实现称之为陷阱指令(Trap Instruction)。
2、外围设备中断:
CPU接收到中断信号时会暂停执行当前命令,转而执行中断信号对应的处理程序。
因为中断的处理属于内核态,如果CPU在处理中断前处于用户态,那么将发生状态切换。
典型的例子是硬盘读写。
3、异常:
CPU在用户态下运行程序时发生了异常,会转到一个处理异常的内核相关程序中,也会导致用户态到内核态的转换。
比如,缺页异常。
【执行步骤】
1、用户态程序将一些数据值放在寄存器中,或者使用参数创建一个栈帧(Stack Frame)。这些数据说明了需要操作系统提供的服务。
2、用户态程序执行陷阱指令。
3、CPU切换到内核态开始执行位于内存指定位置的指令。这些指令属于操作系统的一部分,具有内存保护,不可被用户程序访问。
4、这些指定位置上的指令被称为陷阱(Trap)或者系统调用句柄(System Call Handler)。她们会读取程序放入内存的数据参数并执行程序请求任务。
5、系统调用完成后,操作系统会重置CPU为用户态并将系统调用的结果返回。