内核态与用户态

【简述】
    内核态(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为用户态并将系统调用的结果返回。

你可能感兴趣的:(linux,内核态,用户态)