评论

收藏

[Linux] Linux中内核态指什么?用户态切换到内核态的方式有哪些?

服务系统 服务系统 发布于:2022-09-01 17:07 | 阅读数:315 | 评论:0

在Linux技术大佬口中,我们经常会时不时听到内核态、用户态等,内核主要是和硬件打交道,管理最核心的内容,如硬盘、内存、CPU等,那你知道在Linux系统中,内核态具体是什么吗?请看下文:
Linux系统中的内核态本质是内核,一种特殊的软件程序,用于控制计算机的硬件资源,例如协调CPU资源,分配内存资源,并且提供稳定的环境供应用程序运行。0-4G范围的虚拟空间地址都可以操作,尤其是对3-4G范围的高位虚拟空间地址必须由内核态去操作。
用户态提供应用程序运行的空间,为了使应用程序访问到内核管理的资源,例如CPU,内存,I/O等。用户态只能受限的访问内存,且不允许访问外设 (硬盘、网卡等);内核态CPU可以访问内存所有数据,包括外设,且可以将自己从一个程序切换到另一个程序。
从用户态切换到内核态有以下三种方式:
系统调用:是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。例如上面的例子、还比如fork()实际上就是执行了一个创建新进程的系统调用。(其实系统调用本身就是中断,是软件中断)
异常:如果当前进程运行在用户态,如果这个时候发生了异常事件,就会触发切换。例如:缺页异常。
外设中端:当外设完成用户的请求时,会向 CPU 发送中断信号,此时 CPU 会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。例:如硬盘读写操作完成后,系统会切换到硬盘读写的中断处理程序中执行后续操作。