【问题标题】:Process switch and system level stack进程切换和系统级堆栈
【发布时间】:2014-03-24 02:07:22
【问题描述】:

我正在阅读 Charles Crowley 的操作系统。

在第 5 章实现进程中,他们详细阐述了进程切换流程,并说明了一些关于系统堆栈的内容。

很遗憾,我不了解系统堆栈的工作原理。

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

引自书中:

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

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

不幸的是,在第 5 章中,要么他们没有提供解释目的的正确上下文,要么我没有阅读足够多的次数,或者我很难理解它。

请提出一个简单的解释或参考来阅读。 谢谢

【问题讨论】:

    标签: operating-system


    【解决方案1】:

    “经济实惠”版本:

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

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

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

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

    因此:

    我们通过重新初始化并因此丢弃系统堆栈来做到这一点 每当我们调度进程时

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

    【讨论】:

    • 内核栈和系统栈不相同 :O 。 ??!!
    • 是的,通常一样——我的错:(
    猜你喜欢
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 2014-05-27
    • 2014-07-21
    • 2012-07-26
    • 2010-12-29
    • 2015-03-03
    • 2018-07-01
    相关资源
    最近更新 更多