在x86中,您可以使用TSS在正在运行的进程之间进行任务切换,但是,建议只使用一个TSS(因为您必须这样做)并执行软件任务切换,特别是如果您想将内核移植到没有TSS的其他硬件上。
在x86-64(64位)中,没有TSS(例如,它不像在x86中做任何事情),所以,如果没有它,人们如何去做任务切换(因为以前,你会使用至少一个)?
您的做法与在任何其他平台上的做法相同:存储适当寄存器的内容:
- 堆栈指针
- 指令指针
- 适用于体系结构的通用寄存器
- 任何其他需要维护的状态(FPU/MMX/SSE寄存器等)
为您正在切换的任务,并为您正在切换的任务恢复相同的
通常这是通过将所有状态推入你正在切换的堆栈,并将其从你正在切换的堆栈中弹出来完成的。这样,内核只需要传递或管理堆栈指针来跟踪后台等待的内容。
实际上,似乎在64位模式下有一个TSS,它只是不用于硬件上下文切换;相反,它只是用来指定内核的堆栈,当传输到更高的特权级别时。
您仍然需要使用软件上下文切换,以便在不同任务之间更改控制。