考虑到Linux的情况,我们有每个用户堆栈的内核堆栈,据我所知,无论何时发生上下文切换,我们都会切换到当前进程的内核模式。
这里我们保存当前进程的当前状态,寄存器,程序数据等,然后调度程序(不确定它是否在此内核中运行)保存PCB并加载下一个要安排的进程的PCB。 / p>
现在第一个问题是,如果上面的解释似乎对你有意义,考虑一个上下文切换,其中每个进程也有一个“专用”内核堆栈。
我的问题的另一部分是,如果我们为所有进程都有一个内核堆栈,将如何进行上下文切换?
答案 0 :(得分:0)
每个进程都有自己的内核堆栈。
我将使用最新的内核作为示例。
在include/linux/sched.h
中,有一个名为thread_union
的联合,其定义如下:
union thread_union {
#ifndef CONFIG_THREAD_INFO_IN_TASK
struct thread_info thread_info;
#endif
unsigned long stack[THREAD_SIZE/sizeof(long)];
};
创建新流程后,内核会为其分配thread_union
,每个流程都会有“专用”thread_union
。
thread_info
是一个结构,其中包含指向此过程的task_struct
的指针。stack
是此过程的内核堆栈。thread_info
不是很大,因此内核堆栈有足够的空间。当进程调用系统调用时,它将使用自己的内核堆栈并保存指向内核堆栈中用户堆栈的%ESP
。
每个进程都有自己的thread_union
,因此它们有自己的“专用”内核堆栈。