0

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

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

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

4

1 回答 1

4

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

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

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

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

于 2016-10-25T18:26:35.283 回答