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