我正在阅读Charles Crowley的操作系统。
在第5章“实施流程”中,他们详细阐述了流程切换流程,并对系统堆栈做了一些说明。
不幸的是,我不了解系统堆栈的工作原理。
我的问题: 在正常的编程中,每次调用程序时,我们都会将PC保存在堆栈中并在返回后将其弹出。但是在操作系统环境中,书中说系统堆栈被重新初始化为堆栈顶部(这意味着AFAIHU,删除了对程序调用的历史记录)。
从书中引用:
操作系统是用高级语言编写的。编译器假定它正在运行具有正常堆栈的正常进程。由于操作系统不同,我们必须欺骗编译器做我们想要的。我们通过重新初始化来执行此操作,因此每当我们调度进程时都会丢弃系统堆栈。系统内的调度程序的过程调用将永远不会返回,但编译器会设置一个堆栈帧,假设它将会。
然后如何跟踪返回的位置。 (何时返回是调度程序部分AFAIHU)。
不幸的是,在第5章中,要么他们没有提供解释目的的正确背景,要么我没有阅读足够多次或者我很难理解它。
请建议,一个简单的解释或参考阅读。 感谢
答案 0 :(得分:1)
'经济实惠'版本:
当通过软件中断(系统调用)输入内核代码时,它会交换到系统堆栈,以防止在每个线程上造成内核堆栈开销。如果中断属于可能更改正在运行的线程集的类,则内核代码将用户空间线程堆栈指针保存在与调用线程关联的线程控制块中 - 它必须从内核我的井中断 - 返回到一个不同的线程堆栈,(取决于中断请求和内部状态数据)。
在内核堆栈的某个地方,调度程序/调度程序决定要对运行线程集进行什么操作,并希望再次设置一些线程运行(可能是同一个,也许不是)。它可以通过从TCB恢复用户空间SP并执行中断返回来轻松完成此操作,因此设置线程再次运行。正常'正如您所读到的那样,系统堆栈调用帧是多余的。
不幸的是,有一个障碍。系统堆栈指针现在可能在其原始位置下降了几KB,如果没有做任何事情,系统堆栈将在几次中断后溢出。
当然,在中断返回到用户线程之前,代码可能经历了可悲的层次的耗时返回,只是为了让系统堆栈指针重新启动,但为什么要这么麻烦?更快/更容易/更安全,只需将其设置回那里,以便系统堆栈指针位于下一个中断的正确位置:)
因此:
我们通过重新初始化并因此丢弃系统堆栈来实现这一点 无论何时我们派遣流程
只要从硬件中断/驱动程序输入内核,就会出现类似的问题。