为什么使用线程控制块(TCB)而不是内核堆栈来保存线程信息?

问题描述 投票:0回答:1

一些背景

我一直在研究操作系统,目前正在学习系统调用以及如何使用中断处理它们。我正在学习的课程(Berkly CS 162)表明每个线程在内核中都有一个相应的堆栈,在执行系统调用等特权内容时使用该堆栈。

造成混乱的原因

下图显示中断导致用户堆栈堆栈指针与PC一起保存在内核堆栈上。然后,中断处理程序(在本例中为系统调用)将所有其他寄存器存储在内核堆栈上。 来自 CS 162 Lecutre 的插图

我的问题如下

如果上述信息都存储在与用户堆栈对应的内核堆栈中,为什么我们还要在 TCB 中保存内容呢?在我看来,完整执行上下文(寄存器、用户堆栈、内核堆栈)所需的所有信息都在内核堆栈上吗?这是一个方便的问题,并且能够将 TCB 放入调度程序的良好数据结构中,还是我缺少一些东西。

我尝试在互联网上寻找答案,但没有找到任何答案。然后我使用了人工智能,但它的答案似乎并不基于它可以引用的来源,所以在这里我向你们求助,希望你们能让我变得更聪明。

linux-kernel operating-system kernel systems-programming windows-kernel
1个回答
0
投票

通常有一个单独的中断堆栈,因为先前的进程在服务中断后可能不会成为活动进程。

硬件中断保存少量寄存器(不是全部)。如果中断处理程序需要使用更多寄存器,它必须将它们保存在堆栈上并在最后弹出它们。

中断处理程序通常会在返回之前调用调度程序。 仅当调度程序切换上下文时,您才需要将寄存器保存在上下文块中。

如果中断返回到同一进程,通常保存的唯一寄存器是 PC、SP、R0、R1 和处理器状态寄存器(因系统而异)。

您的幻灯片混淆了中断处理和系统服务调用处理。

© www.soinside.com 2019 - 2024. All rights reserved.