【问题标题】:When kernel stack's esp is stored to TSS for interrupt return iret?当内核堆栈的esp存储到TSS以进行中断返回iret时?
【发布时间】:2022-01-11 06:40:00
【问题描述】:

当我阅读 Intel 的 X86 程序员手册时,请参阅以下关于堆栈切换的中断和中断返回:

中断:

如果确实发生了堆栈切换,处理器会执行以下操作:

  1. 临时保存(内部)SS、ESP、EFLAGS、CS 和 EIP 寄存器的当前内容。
  2. 将新堆栈的段选择器和堆栈指针(即被调用的特权级别的堆栈)从 TSS 加载到 SS 和 ESP 寄存器并切换到新堆栈。
  3. 将被中断过程堆栈的临时保存的 SS、ESP、EFLAGS、CS 和 EIP 值推送到新堆栈中。
  4. 在新堆栈上推送错误代码(如果适用)。
  5. 将新代码段的段选择器和新指令指针(来自中断门或陷阱门)分别加载到 CS 和 EIP 寄存器中。
  6. 如果调用是通过中断门,清除 EFLAGS 寄存器中的 IF 标志。
  7. 以新的权限级别开始执行处理程序。

返回时:

  1. 执行权限检查。
  2. 将 CS 和 EIP 寄存器恢复为中断或异常之前的值。
  3. 恢复 EFLAGS 寄存器。
  4. 将 SS 和 ESP 寄存器恢复为其在中断或异常之前的值,从而导致堆栈切换回中断过程的堆栈。
  5. 恢复执行中断的过程。

比如一个linux进程P:

  1. 最初处于内核模式
  2. 通过iret返回用户模式。但是从手册上看,TSS 没有变化
  3. 它通过int 陷入内核。这里需要从 TSS 中的ESP & SS 找到内核栈。这个内核堆栈值是如何设置的,因为它们没有在步骤 2 中存储到 TSS?

【问题讨论】:

    标签: linux-kernel x86 operating-system kernel interrupt


    【解决方案1】:

    一旦内核为给定的任务返回用户空间,它就会使用该任务的内核堆栈完成,直到下一个中​​断/异常。它没有有用的数据,因此 TSS 可以保存一个固定的 SS:[ER]SP 值,该值指向分配为current 任务的内核堆栈的虚拟页[s] 的顶部。

    内核状态不在内核入口之间的内核堆栈上;它保存在过程控制块中的其他位置。 (请求之间的上下文切换实际上发生在内核中,将内核堆栈切换到以前睡眠任务的内核堆栈,因此最终返回用户空间意味着返回该任务首先在内核中执行的调用链)。

    顺便说一句,除非内核为iret 推送新的 CS:EIP / EFLAGS / SS:ESP 以弹出,否则它弹出的内容将是硬件在 TSS 中指定的地址处推送的内容。因此,即使在您离开堆栈时希望通过堆栈重新进入内核,那通常无论如何都在 TSS 位置。但这无关紧要,因为 Linux 不会在用户空间运行时将内容保存在任务的内核堆栈上,除了指向内核可以找到的区域底部的每个任务内容的指针它与[ER]SP & -16384.

    (我认为这是对的;我已经查看了一些 Linux 内核代码,但还没有真正动手做实验。我认为这就是 Linux 的工作原理,以及一致的可行设计。)

    【讨论】:

    • 所以问题是:固定的 SS:ESP 值何时存储到 TSS?我没有检查内核代码,但我想这是在iret 之前由内核而不是硬件完成的?
    • @zminya:我假设它是上下文切换的一部分。就像我解释的那样,不必在每次内核用户转换时都对其进行修改。每个任务都有自己的内核堆栈,因此在switch_to 实际更改内核 ESP 之后的某个时间点,TSS 应该更新为分配给新的新current 的堆栈区域的顶部。
    • 请注意,这取决于内核设计。大多数普通内核(例如 Linux)使用“每个用户空间任务的内核堆栈”,其中 TSS 中的 ESP0 在任务切换时更改。一些内核(主要是小型微内核)使用“每个 CPU 一个内核堆栈(每个 CPU 一个 TSS)”,其中 TSS 中的ESP0 在引导期间设置一次并且永远不会更改。甚至有可能(使用分页技巧)让“所有内核堆栈都位于相同的虚拟地址(和不同的物理地址)”,其中只有一个 TSS 并且它的ESP0 永远不会改变(每个用户有或没有不同的内核堆栈-空间任务)。
    • @PeterCordes 现在很清楚了。非常感谢
    猜你喜欢
    • 2021-05-11
    • 2013-01-08
    • 2016-04-05
    • 2012-10-12
    • 2022-01-05
    • 2012-05-14
    • 2021-04-15
    • 2020-07-16
    • 2021-01-13
    相关资源
    最近更新 更多