Operating system 进程交换机和系统级堆栈

Operating system 进程交换机和系统级堆栈,operating-system,Operating System,我正在读查尔斯·克劳利的《操作系统》 在第5章实现过程中,他们详细阐述了过程切换流程,并对系统堆栈做了一些说明 不幸的是,我不了解系统堆栈的工作原理 我的问题: 在正常编程中,每次过程调用都会将PC保存在堆栈上,并在返回后弹出。但在操作系统环境中,书中说系统堆栈被重新初始化到堆栈顶部(这意味着AFAIHU,删除过程调用的历史记录) 从书中引用: 操作系统是用高级语言编写的。编译器假定它正在运行具有正常堆栈的正常进程。由于操作系统是不同的,我们必须欺骗编译器去做我们想做的事情。我们通过重新初始化来

我正在读查尔斯·克劳利的《操作系统》

在第5章实现过程中,他们详细阐述了过程切换流程,并对系统堆栈做了一些说明

不幸的是,我不了解系统堆栈的工作原理

我的问题: 在正常编程中,每次过程调用都会将PC保存在堆栈上,并在返回后弹出。但在操作系统环境中,书中说系统堆栈被重新初始化到堆栈顶部(这意味着AFAIHU,删除过程调用的历史记录)

从书中引用:

操作系统是用高级语言编写的。编译器假定它正在运行具有正常堆栈的正常进程。由于操作系统是不同的,我们必须欺骗编译器去做我们想做的事情。我们通过重新初始化来实现这一点,并因此在分派进程时丢弃系统堆栈。对系统内部调度程序的过程调用永远不会从返回,但编译器会设置一个堆栈框架,假设它会返回

那么它如何跟踪返回的位置呢。(何时返回是调度程序部分AFAIHU)

不幸的是,在第5章中,要么他们没有提供解释目的的正确上下文,要么我没有阅读足够的次数,要么我在理解它时遇到了严重的困难

请建议,一个简单的解释或参考阅读。
谢谢

“真相经济”版本:

当通过软件中断(系统调用)输入内核代码时,它将交换到系统堆栈,以防止内核堆栈开销对每个线程造成影响。如果中断属于可能会更改运行线程集的类,则内核代码会将用户空间线程堆栈指针保存在与调用线程相关联的线程控制块中,因为内核my well中断返回到不同的线程堆栈(取决于中断请求和内部状态数据)

在内核堆栈的某个地方,调度器/调度器决定如何处理正在运行的线程集,并希望设置一些线程再次运行(可能是同一个线程,也可能不是)。它可以通过从TCB恢复用户空间SP并执行中断返回来轻松实现这一点,从而设置一个线程再次运行。如前所述,“正常”系统堆栈调用帧是冗余的

不幸的是,有一个障碍。系统堆栈指针现在可能在其原始位置上向下数KB,如果不执行任何操作,系统堆栈将在几次中断后溢出

当然,在中断返回到用户线程之前,代码可能会经历痛苦的耗时返回层,只是为了恢复系统堆栈指针,但是为什么要这么麻烦呢?更快速/更容易/更安全的方法是将其设置回原来的位置,以便系统堆栈指针位于下一个中断的正确位置:)

因此:

我们通过重新初始化从而丢弃系统堆栈来实现这一点 无论何时我们调度进程


每当从硬件中断/驱动程序输入内核时,就会出现类似的问题。

内核堆栈和系统堆栈不相同:O??!!是的,通常是一样的-我的错:(