在看到操作系统和内核方面的书时,经常会碰到名词进程上下文(Process
Context)和中断上下文(Interrupt
Context)查阅了一些资料总结如下:
《linux内核设计与实现》中的一段话:
一般程序在用户空间执行,当一个程序执行了系统调用,或者触发了某个异常,他就陷入了内核空间。此时,我们称内核“代表进程执行”并处于进程上下文中。在此上下文中current宏是有效的。除非在此间隙有更高优先级的进程需要执行并由调度器作出了相应调整,否则在内核退出时,程序恢复在用户空间继续执行。
《linux完全注释》中的一段话:
当一个进程在执行时,cpu的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文。当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的上下文,以便在再次执行时,能够必得到切换时的状态执行下去,在linux中,当前进程上下文均保存在进程的任务数据结构中。在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。但是同时会保留所有需要用到的资源,以便中断服务结束时能恢复中断进程的执行。
我们都知道,处理器始终处于以下几种状态中的一种:
1.内核态,运行与进程上下文,内核代表进程运行于内核空间
2.内核态,运行于中断上下文,内核代表硬件运行于内核空间
3.用户态,运行于用户空间。
上下文context:上下文简单来说就是一个环境,相对于进程而言,就是进程执行时的环境。具体来说就是各个变量和数据,包括所有的寄存器的变量、进程打开的文件内存信息等。
一个进程的上下文可以分为三个部分:用户级上下文,寄存器上下文以及系统级上下文。
用户级上下文:正文、数据、用户堆栈、以及共享存储区;
寄存器上下文:通用寄存器、程序寄存器(IP)、处理器状态寄存器(FLAGS)、栈指针(ESP)。
系统级上下文:进程控制块(task struct)内存管理信息(mms_truct、vm_area、pgd、pte)、内核栈。
当发生进程调度时,进行进程切换就是上下文切换(context switch)。操作系统必须对上面提到的全部信息进行切换,新调度的进程才能运行。而系统调用进行的模式切换(mod switch)。模式切换最主要的任务只是切换进程寄存器上下文的切换。
附:进程数据结构(thread struct)
struct thread_struct {
unsigned long esp0;
unsigned long eip;
unsigned long esp;
unsigned long fs;
unsigned long gs;
/* Hardware debugging registers */
unsigned long debugreg[8]; /* %%db0-7 debug registers */
/* fault info */
unsigned long cr2, trap_no, error_code;
/* floating point info */
union i387_union i387;
/* virtual 86 mode info */
struct vm86_struct * vm86_info;
unsigned long screen_bitmap;
unsigned long v86flags, v86mask, saved_esp0;
/* IO permissions */
int ioperm;
unsigned long io_bitmap[IO_BITMAP_SIZE+1];
};
阅读(910) | 评论(0) | 转发(0) |