进程上下文和中断上下文

 处理器总是处于一下状态中的一种:

  1、  内核态,运行于进程上下文,内核代表进程运行于内核空间;

  2、  内核态,运行于中断上下文,内核代表硬件运行于内核空间;

  3、  用户态,运行于用户空间。

 

用户空间的应用程序,通过系统调用,进入内核空间。此时用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户的进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看做用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境。

 

硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进程中断处理。所谓的“中断上下文”,其实也可以看做就是硬件传递过来的这些参数和内核需要保存的一些环境。

 

当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为进程上下文。

当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的上下文,以便在再次执行该进程是,能够必得到切换时的状态执行下去。

在Linux中,当前进程上下文均保存在进程的任务数据结构中。

在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。但同时会保存所有需要用到的资源,以便中断服务结束时能够恢复被中断进程的执行。

上下文context: 运行环境,对于进程而言就是执行的环境(各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等)

一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。

用户级上下文:正文、数据、用户堆栈以及共享存储区

寄存器上下文:通用寄存器,程序寄存器、处理器状态寄存器、栈指针

系统级上下文:进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。

当发生进程调度时,进行进程切换就是上下文切换(context switch)。操作系统必须对上面提到的全部信息进行切换,新调度的进程才能运行。

而系统调用进行的模式切换(mode switch)。模式切换与进程切换比较起来,容易很多,而且节省时间,因为模式切换最主要的任务只是切换进程寄存器上下文的切换。

posted @ 2013-10-10 07:24  风刃  阅读(240)  评论(0编辑  收藏