请问中断保护现场和进程切换保存环境信息有什么区别吗?

请问中断保护现场和进程切换保存环境信息有什么区别吗?

举个例子,如果是syscall指令的话,本质上是通过软中断 来trap进入内核,你会发现进入内核前他首先切换了一下gs寄存器,然后push了一堆寄存器,然后再切换到内核栈。其实就是保存了当前进程用户态的上下文信息,切换到内核态。当syscall正常返回时,内核会用iretq来弹出用户态时保存的寄存器信息,重新切回用户态。你会发现当你内核态处理完毕,重新着陆到用户态的时候,你的上下文仍然是调用syscall的用户进程的。并且内核态对应current_task的PCB没有变。

至于你说的进程切换,用户态进程能主动实现进程调度/切换吗………?除了用exec族函数直接替换掉当前进程上下文的这种方式(如果这也算进程切换的话)。不过内核态可以通过schedule()来触发进程调度,基本上流程就是你书上写的这几步。但区别是,你切换进程之后,当前的进程在内核态的控制结构已经不一样了(PCB),这大概就是书上说的 “当前进程的环境信息也需要改变”,而PCB中维护了对于current_task非常重要的运行时环境信息。

中断就是打断当前进程转而去处理中断事件,所以必须要保存现场,而所谓现场,其实最为核心的就是进程在被打断时刻的各种寄存器的值,将这些信息压到内核栈就是所谓的保存上下文了,而中断结束的时候将这些信息弹到相应位置就是所谓的恢复上下文了

而进程切换,什么时候会进程切换,一般来说就是一个进程主动休眠让出cpu 或者是当前进程运行了一定时间了需要被换下来。前者主动休眠一般是执行了系统调用比如sleep函数,而后者一般是时钟中断的时候发生。

所以两者都可以看做是在中断的时候发生进程切换,因此发生了中断的话,上面说了是肯定会将一系列寄存器给压栈来保存现场的。

那进程切换究竟与中断时保存现场有什么区别。对于这问题首先明白进程与进程之间最大的区别是什么,区别在于他们拥有自己独立的虚拟地址空间,而这从本质上来说就是每个进程拥有自己独立的页表。

关于虚拟地址空间的布局图相信您应该很熟悉了,其上有堆栈等等结构,这些东西就可以看做是进程运行时的环境。

进程切换的时候是需要切换到各自的页表的,这也就相当于切换了进程运行的环境。而关于前一个进程的现场已经保存到了它自己的内核栈里面了。