内核态与用户态
# 用户态和内核态?
用户态:用户态运行的进程可以直接读取用户程序的数据,拥有较低的权限。当应用程序需要执行某些需要特殊权限的操作,例如读写磁盘、网络通信等,就需要向操作系统发起系统调用请求,进入内核态;
内核态:可以访问计算机的任何资源包括系统的内存空间、设备、驱动程序等,不受限制,拥有非常高的权限。当操作系统接收到进程的系统调用请求时,就会从用户态切换到内核态,执行相应的系统调用,并将结果返回给进程,最后再从内核态切换回用户态;
# 何时运行在用户态/内核态?
当进行IO操作:读写硬盘文件,读写网卡数据等,进程需要切换到内核态;
切换时,都需要进行一次上下文切换;
应用不能直接操作内核空间的数据,需要把内核态的数据拷贝到用户空间才能操作;
# 用户态切换到内核态3种方式?
- 系统调用:IO操作,如磁盘读取,网卡数据读取;
- 中断:当外围设备完成用户请求的操作后,会向 CPU 发出相应的中断信号,这时 CPU 会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换;
- 异常:当 CPU 在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常;
← 快表 接受一个网络包的流程→