我一直在研究操作系统,目前正在学习系统调用以及如何使用中断处理它们。我正在学习的课程(Berkly CS 162)表明每个线程在内核中都有一个相应的堆栈,在执行系统调用等特权内容时使用该堆栈。
下图显示中断导致用户堆栈堆栈指针与PC一起保存在内核堆栈上。然后,中断处理程序(在本例中为系统调用)将所有其他寄存器存储在内核堆栈上。 来自 CS 162 Lecutre 的插图
如果上述信息都存储在与用户堆栈对应的内核堆栈中,为什么我们还要在 TCB 中保存内容呢?在我看来,完整执行上下文(寄存器、用户堆栈、内核堆栈)所需的所有信息都在内核堆栈上吗?这是一个方便的问题,并且能够将 TCB 放入调度程序的良好数据结构中,还是我缺少一些东西。
我尝试在互联网上寻找答案,但没有找到任何答案。然后我使用了人工智能,但它的答案似乎并不基于它可以引用的来源,所以在这里我向你们求助,希望你们能让我变得更聪明。
通常有一个单独的中断堆栈,因为先前的进程在服务中断后可能不会成为活动进程。
硬件中断保存少量寄存器(不是全部)。如果中断处理程序需要使用更多寄存器,它必须将它们保存在堆栈上并在最后弹出它们。
中断处理程序通常会在返回之前调用调度程序。 仅当调度程序切换上下文时,您才需要将寄存器保存在上下文块中。
如果中断返回到同一进程,通常保存的唯一寄存器是 PC、SP、R0、R1 和处理器状态寄存器(因系统而异)。
您的幻灯片混淆了中断处理和系统服务调用处理。