什么时候会发生从用户态转到内核态(转)

原文: https://blog.csdn.net/HappySundlut/article/details/120191682

为什么要分用户态和内核态
CPU将指令分为特权指令和非特权指令

对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令

  1. 特权指令——在系统态时运行的指令
    对内存空间的访问范围基本不受限制,不仅能访问用户存储空间,也能访问系统存储空间,
    特权指令只允许操作系统使用,不允许应用程序使用,否则会引起系统混乱。
  2. 非特权指令——在用户态时运行的指令
    一般应用程序所使用的都是非特权指令,它只能完成一般性的操作和任务,不能对系统中的硬件和软件直接进行访问,其对内存的访问范围也局限于用户空间。

用户态切换到内核态的唯一途径——>中断/异常/陷入(陷入又可称作系统调用)
内核态切换到用户态的途径——>设置程序状态字(CPU中有个PSW寄存器,其中有个模式位(mode bit)设置为0时表示内核模式,设置为1时表示用户模式)
注意一条特殊的指令——陷入指令(又称为访管指令,因为内核态也被称为管理态,访管就是访问管理态)

该指令给用户提供接口,用于调用操作系统的服务。

什么时候从用户态切换到内核态
运行于用户态的进程可以执行的操作和访问的资源都受到极大的限制,而运行于内核态的进程则可以执行任何操作并且在资源的使用上也没有限制。很多程序开始时运行于用户态,但在执行的过程中,一些操作需要在内核权限下才能执行,这就涉及到一个从用户态切换到内核态的过程。

首先需要了解,什么情况下会发生从用户态向内核态切换。这里细分为3种情况。 (关于中断、异常、信号之间的区别

1、发生系统调用时

这是处于用户态的进程主动请求切换到内核态的一种方式。用户态的进程通过系统调用申请使用操作系统提供的系统调用服务例程来处理任务。而系统调用的机制,其核心仍是使用了操作系统为用户特别开发的一个中断机制来实现的,即软中断。

2、产生异常时

当CPU执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行的进程切换到处理此异常的内核相关的程序中,也就是转到了内核态,如缺页异常

3、外设产生中断时

中断当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作的完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

(比如有个进程A需要用户输入用户名和密码,A会调用系统调用read(),用户输入这个过程肯定是很慢的,这个过程中因为A要等待IO就绪所以内核会阻塞A,CPU被分配给其他进程,等到用户输入完成敲回车后,键盘向CPU发出中断信号,当前正在占用CPU的进程就会被中断,系统把处理用户名密码的这个进程调入CPU,如果是epoll模式,还需要把数据从内核空间拷贝回用户空间,如果是preactor模式的话数据是直接写入用户空间的,用户进程就可以直接读取数据了)

可以看到上述三种由用户态切换到内核态的情况中,只有系统调用是进程主动请求发生切换的,中断和异常都是被动的。

posted @ 2023-05-31 00:00  大黑耗  阅读(578)  评论(0编辑  收藏  举报