用户态和内核态
用户态:只能受限的访问内存,且不允许访问外围设备。
内核态:可以访问到所有数据,包括外围设备、用户空间和系统空间。
为什么要有用户态和内核态
为了限制不同程序之间的访问能力,防止他们获取到别的程序的内存数据,或者获取外围设备的数据,所以就分成了两个权限——用户态和内核态。
用户态和内核态的切换
系统调用
一般情况下, 所有的用户程序都是运行在用户态下的,但是有些时候程序必须得做一些内核态的事情,比如从硬盘读取数据或者获取键盘输入等等,那么这些时候程序就必须通过申请使用操作系统提供的服务程序来完成工作。
这时就需要一个机制,让用户态程序切换到内核态,但是又不能控制在内核态中执行的指令。这种机制就被称为系统调用,在CPU中的实现被称为陷阱指令。
异常
当程序处于用户态下执行时,发生了某些事先不可预知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
中断
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。