首页 文章

调度 - 每个进程具有一个或多个内核堆栈的上下文切换

提问于
浏览
0

考虑到Linux的情况,我们有每个用户堆栈的内核堆栈,据我所知,每当发生上下文切换时,我们都会切换到当前进程的内核模式 .

在这里,我们保存当前进程的当前状态,寄存器,程序数据等,然后调度程序(不确定它是否在此内核中运行)保存PCB并加载下一个要调度的进程的PCB .

现在第一个问题是,如果上面的解释似乎对你有意义,考虑一个上下文切换,其中每个进程也有一个“专用”内核堆栈 .

我的问题的另一部分是,如果我们为所有进程都有一个内核堆栈,将如何进行上下文切换?

1 回答

  • 0

    Each process has its own kernel stack.

    我将使用最新的内核作为示例 .

    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 ,每个进程都将具有"dedicated" thread_union .

    • 第一个成员 thread_info 是一个结构,其中包含指向此进程的 task_struct 的指针 .

    • 第二个成员 stack 是此进程的内核堆栈 .

    • 这是一个联合,因此两个成员使用相同的内存空间 . thread_info 不是很大,因此内核堆栈有足够的空间 .

    当进程调用系统调用时,它将使用自己的内核堆栈并保存指向内核堆栈中用户堆栈的 %ESP .

    每个进程都有自己的 thread_union ,因此它们有自己的"dedicated"内核堆栈 .

相关问题