x86-32 上的任务切换

Task switching on the x86-32

ESP 和 SS 指的是什么?.例如,如果我执行任务切换,从具有 ring 0 特权级别的 TASK_1 切换到具有相同 ring 0 特权级别的另一个 TASK_2。将使用(ESP 和 SS)或(SS0 和ESP0) 上下文切换完成后。

1- SS0、SS1、SS2 是否仅在堆栈切换的情况下使用 "within" 任务?

2- SS 是否可以持有任何特权级别的堆栈段,还是专用于 ring 3 的堆栈段?

我假设您谈论的是 32 位 TSS(任务状态段),它是 CPU 出于各种目的使用的内存结构。 ESP 和 SS 字段是 CPU 保存旧任务的 ESP 和 SS 并在 CPU 托管任务切换期间恢复新任务的 ESP 和 SS 值的地方。这些字段在任务切换期间保存和恢复,就像其他通用和段寄存器字段(例如 EAX 或 DS)一样。

任务切换期间从不使用 ESP0、ESP1、ESP2、SS0、SS1、SS2 字段。它们仅在中断或异常导致同一任务中更改为更高特权级别时使用。这会导致堆栈切换,将当前 TSS 中的适当 ESP# 和 SS# 值加载到 ESP 和 SS 寄存器中,并将旧的 ESP 和 SS 值保存在新堆栈中。 CPU 从未更改这些 TSS 字段。当中断处理程序 returns 到权限较低的代码时,CPU 从堆栈中恢复保存的 ESP 和 SS 值。

虽然任务切换会导致 CPU 的特权级别发生变化,但它绝不会导致任务的特权级别发生变化。新任务继续以其先前执行时所具有的相同特权级别执行。

请注意,虽然 32 位保护模式本质上要求 OS 设置 TSS,但不要求 OS 使用 TSS 进行任务切换。 OS 也可以使用它自己的机制手动切换任务,这也是大多数 32 位 x86 操作系统的工作方式。 (而且由于 CPU 在 64 位长模式下不提供任务切换机制,所有 64 位 x86 OSes 都是这样工作的。)