gpt4 book ai didi

process - 内核栈有什么用?

转载 作者:行者123 更新时间:2023-12-04 04:16:49 27 4
gpt4 key购买 nike

以下是我读到的关于进程 A 和进程 B 之间的上下文切换的描述。我不明白内核堆栈是做什么用的。假设有一个每个进程的内核堆栈。我正在阅读的描述谈到将 A 的寄存器保存到 A 的内核堆栈上,并将 A 的寄存器保存到 A 的进程结构中。 将寄存器保存到内核堆栈和进程结构中到底有什么意义?为什么需要两者?

A context switch is conceptually simple: all the OS has to do is save a few register values for the currently-executing process (onto its kernel stack, for example) and restore a few for the soon-to-be-executing process (from its kernel stack). By doing so, the OS thus ensures that when the return-from-trap instruction is finally executed, instead of returning to the process that was running, the system resumes execution of another process...

Process A is running and then is interrupted by the timer interrupt. The hardware saves its registers (onto its kernel stack) and enters the kernel (switching to kernel mode). In the timer interrupt handler, the OS decides to switch from running Process A to Process B. At that point, it calls the switch() routine, which carefully saves current register values (into the process structure of A), restores the registers of Process B (from its process structure entry), and then switches contexts, specifically by changing the stack pointer to use B’s kernel stack (and not A’s). Finally, the OS returns-from-trap, which restores B’s registers and starts running it.

最佳答案

我对第二段有异议。

Process A is running and then is interrupted by the timer interrupt. The hardware saves its registers (onto its kernel stack) and enters the kernel (switching to kernel mode).



我不知道有一个系统可以在中断时保存内核堆栈上的所有寄存器。程序计数器、处理器状态和堆栈指针(假设硬件没有单独的内核模式堆栈指针)。通常,处理器在中断后在内核堆栈中保存必要的最小值。然后中断处理程序将保存它想要使用的任何附加寄存器并在退出前恢复它们。处理器的 RETURN FROM INTERRUPT 或 EXCEPTION 指令然后恢复由中断自动存储的寄存器。

该描述假设过程没有变化。

如果中断句柄决定改变进程,它会保存当前的寄存器状态(“进程上下文”——大多数处理器都有一条指令。在英特尔领域,你可能必须使用多条指令)然后执行另一条指令来加载新进程的进程上下文。

要回答您的标题问题“内核堆栈用于什么?”,只要处理器处于内核模式,就会使用它。如果内核没有保护用户访问的堆栈,则系统的完整性可能会受到损害。内核堆栈往往非常小。

要回答您的第二个问题,“将寄存器同时保存到内核堆栈和进程结构中有什么意义,为什么需要两者?”

它们有两个不同的目的。内核堆栈上保存的寄存器用于退出内核模式。上下文进程块保存整个寄存器集以更改进程。

我认为您的误解来自您的消息来源的措辞,即在进入内核模式时所有寄存器都存储在堆栈中,而不仅仅是进行内核模式切换所需的最少寄存器数量。系统通常只会保存返回用户模式所需的内容(并且可能使用相同的信息在另一个上下文切换中返回原始进程,具体取决于系统)。进程上下文的更改保存了所有寄存器。

编辑以回答其他问题:

如果中断处理程序需要使用未被中断自动保存的寄存器,它会在进入时将它们压入内核堆栈,并在退出时将它们弹出。中断处理程序必须显式保存和恢复它使用的任何 [通用] 寄存器。进程上下文块没有被触及。

进程上下文块仅作为实际上下文切换的一部分进行更改。

例子:

假设我们有一个带有程序计数器、堆栈指针、处理器状态和 16 个通用寄存器的处理器(我知道没有这样的系统真的存在),并且所有模式都使用相同的 SP。
  • 发生中断。

  • 硬件将 PC、SP 和 PS 插入堆栈,将内核模式堆栈的地址和来自中断处理程序(来自处理器的调度表)的 PC 加载到 SP。
  • 中断处理程序被调用。

  • 处理程序的作者决定他要去我们 R0-R3。所以处理程序的第一行有:
    Push R0  ; on to the kernel mode stack
    Push R1
    Push R2
    Push R3
  • 中断处理程序做它想做的任何事情。
  • 清理

  • 中断处理程序的编写者需要做:
    Pop R3
    Pop R2
    Pop R1
    Pop R0
    REI ; Whatever the system's return from interrupt or exception instruction is.
  • 硬件接管

  • 从内核模式堆栈中恢复 PS、PC 和 SP,然后在中断前的位置恢复执行。

    为了简化,我已经制作了自己的处理器。一些处理器具有可中断的冗长指令(例如块字符移动)。此类指令通常使用寄存器来维护其上下文。在这样的系统上,处理器必须自动保存用于维护指令内上下文的任何寄存器。

    除非正在更改进程,否则中断处理程序不会与进程上下文块混淆。

    关于process - 内核栈有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30419872/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com